Цели c не нравится мой unichars?

Жалобы XCode на "мультисимвольную символьную константу", когда я пытаюсь сделать следующее:

static unichar accent characters[] = { 'ā', 'á', 'ă', 'à' };

Как Вы делаете массив символов, если не все они - ASCII? Следующее работает просто великолепно

static unichar accent[] = { 'a', 'b', 'c' }; 

Обходное решение

Самая близкая работа вокруг я нашел, должен преобразовать специальные символы в шестнадцатеричное число, т.е. это работает:

static unichar accent characters[] = { 0x0100, 0x0101, 0x0102 };
8
задан robbie_c 13 June 2013 в 13:49
поделиться

1 ответ

Это не так, чтобы объектив-С не понравится, это то, что C не. Константа «C» является для CHAR , которая имеет 1 байт, а не Unichar , который имеет 2 байта. (См. Примечание ниже для более подробной детализации.)

Нет идеально поддержанного способа представлять константу Unichar . Вы можете использовать

char* s="ü";

в исходном файле UTF-8, чтобы получить C-String Unicode C-String или

NSString* s=@"ü";

в кодированном исходном файле UTF-8, чтобы получить NSString . (Это было невозможно до 10,5. Это нормально для iPhone.)

Sliping сам концептуально кодирует нейтраль; Но если вы хотите, вы можете получить символ Unicode с помощью -CharacterAtindex: .

Наконец-то два комментария:

  • Если вы просто хотите удалить акценты из строки, вы можете просто использовать такой метод, не написав таблицу самостоятельно:

     - (NSString *) StringWithoutCentsFromString: (NSString *)  с
     {
      Если (! S) вернуть Nil;
      NsmutableString * Результат = [NSMutableStrying StringWithString: S];
      Результат cfstringfold ((cfmutableStringref), KCFCOMPAREDICARITIONINGITION, NULL);
      возвратный результат;
     }
     

    См. Документ CFStringfold .

  • Если вы хотите символы Unicode для локализации / интернационализации, вы не должны встраивать строки в исходный код. Вместо этого вы должны использовать локализуемые .Strings и NSLOCalizedStringString . См. здесь .

Примечание: Для тайных исторических причин «А» - это INT в C, см. Обсуждение здесь . В C ++ это Char . Но это не изменить тот факт, что написание более одного байта внутри '...' , определяется и не рекомендуется. Например, см. ISO C Standard 6.4.4.10 . Тем не менее, в классической Mac OS был общим написать четырехбуквенный код, заключенный в отдельные кавычки, вроде «Appl» . Но это еще одна история ...

Другим осложнением является то, что акцентированные буквы не всегда представлены 1 байтом; Это зависит от кодировки. В UTF-8 это нет. В ISO-8859-1 это есть. И Unichar должен быть в UTF-16. Вы сохранили свой исходный код в UTF-16? Я думаю, что по умолчанию XCode является UTF-8. GCC может сделать конверсию кодирования в зависимости от установки тоже ...

18
ответ дан 5 December 2019 в 05:56
поделиться