Цель c не любит мои unichars? - PullRequest
8 голосов
/ 28 января 2010

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

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

Как создать массив символов, если не все из них являются ascii? Следующее работает просто отлично

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

Обход

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

static unichar accent characters[] = { 0x0100, 0x0101, 0x0102 };

Ответы [ 3 ]

18 голосов
/ 28 января 2010

Дело не в том, что Objective-C не нравится, а в том, что C не нравится. Константа 'c' предназначена для char с 1 байтом, а не unichar с 2 байтами. (см. примечание ниже для более подробной информации.)

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

char* s="ü";

в исходном файле в кодировке UTF-8 для получения C-строки Unicode или

NSString* s=@"ü";

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

NSString сам по себе концептуально нейтрален; но если вы хотите, вы можете получить символ Unicode, используя -characterAtIndex:.

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

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

    -(NSString*)stringWithoutAccentsFromString:(NSString*)s
    {
        if (!s) return nil;
        NSMutableString *result = [NSMutableString stringWithString:s];
        CFStringFold((CFMutableStringRef)result, kCFCompareDiacriticInsensitive, NULL);
        return result;
    }
    

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

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

Примечание: По загадочным историческим причинам 'a' - это int в C, см. Обсуждение здесь . В C ++ это char. Но это не меняет того факта, что запись более одного байта внутри '...' определяется реализацией и не рекомендуется. Например, см. ISO C Стандарт 6.4.4.10 . Однако в классической Mac OS было обычным делом писать четырехбуквенный код, заключенный в одинарные кавычки, например 'APPL'. Но это другая история ...

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

7 голосов
/ 10 августа 2011

Или вы можете просто сделать это так:

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

L - это стандартное ключевое слово C, которое говорит: «Я собираюсь написать символ UNICODE или набор символов».

Хорошо работает и для Objective-C.

Примечание: компилятор может выдавать вам странное предупреждение о слишком большом количестве символов, помещенных в unichar, но вы можете спокойно игнорировать это предупреждение Xcode просто неправильно обрабатывает символы Юникода, но компилятор правильно их анализирует, и результат в порядке.

3 голосов
/ 03 сентября 2014

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

NSCharacterSet* accents = 
    [NSCharacterSet characterSetWithCharactersInString:@"āáăà"];

И затем, если вы хотите проверить, является ли данный unichar одним из этих символов акцента:

if ([accents characterIsMember:someOtherUnichar])
{
}

NSString также имеет много собственных методов для обработки NSCharacterSet объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...