Как бороться с кодировкой символов в Obj-C? - PullRequest
2 голосов
/ 30 октября 2010

Я новичок в Obj-C (мой опыт работы с Java и немного C)

Сейчас у меня есть этот проект, который представляет собой шифрование на арабском языке. Мне нужно прочитать текстовый файл на арабском языке (символ за символом), но когда я хочу использовать эти символы и сохранять их в переменных (типа char ) Я не мог .. это выдает мне предупреждение "Многосимвольная символьная константа" в этой строке:

char c = 'ب'; // здесь я пытаюсь сохранить букву "Bah" в переменной типа char

Я думаю, что это проблема кодирования, но я не знаю, в чем конкретно проблема, и я потратил последние 2 дня на поиски решения, но не смог его найти :( ..

Заранее спасибо:)

Ответы [ 4 ]

3 голосов
/ 30 октября 2010

Если вы хотите иметь дело с Юникодом в Objective-C, вы должны использовать NSString вместо char типов.NSString настроен для работы с Юникодом.

Используйте characterAtIndex - цикл по строке

for (characterIndex = 0; characterIndex < [myString length]; characterIndex++)
{
    unichar testCharacter = [myString characterAtIndex:characterIndex];
    // do stuff
}
2 голосов
/ 30 октября 2010

Средство просмотра персонажа говорит мне, что ваш персонаж имеет номер юникода 0x628.Он слишком большой, чтобы хранить его в одном символе, который составляет всего 8 бит.Хорошей новостью является то, что он будет вписываться в unichar так:

unichar c = 'ب';

может работать.Но компилятор не гарантирует, что сможет обрабатывать символы вне ограниченного набора символов.В целях безопасности вы можете явно использовать кодировку UTF-16 (это то, что NSStrings использует внутри. Так:

unichar c = 0x628; // Arabic Beh (UTF-16)

Или, если вы предпочитаете UTF-8, кодировка UTF-8 для этого номера Unicode будетD8 A8:

char c[2] = { 0xD8, 0xA8 };  // Arabic Beh (UTF-8)

Редактировать:

Некоторые способы перевода символа в строку NSSt:

Использование -stringWithFormat:

NSString* foo = [NSString stringWithFormat: @"beh %C", (unichar) 0x628];

Или

NSString* foo = [NSString stringWithUTF8String: "beh \xD8\xAB"];
1 голос
/ 30 октября 2010
  1. Вы пробовали unichar? Простой char не будет работать независимо от кодировки, он слишком мал.

  2. Вам действительно нужно работать с отдельными персонажами? NSString не подойдет?

  3. Что это за шифрование? Не могли бы вы зашифровать потоки байтов независимо от их значения?

0 голосов
/ 31 октября 2010

Я предлагаю вам использовать NSData. Итак, все, что вам нужно, это получить объект NSData из NSString, затем запросить его байты, кодировать их, напиши им. Следующий. Загрузите, декодируйте и создайте NSString из этих данных. Вот полезные методы:

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding// for NSString
- (const void *)bytes// for NSData
- (void *)mutableBytes// if you prefer work with NSMutableData constructed from NSData with mutableCopy method
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding// to restore NSString back when decoding
...