Локализация iOS: escape-последовательности символов Unicode, имеющие вид '\uxxxx', не работают.

У нас есть пара ключ-значение в файле Localization.string.

"spanish-key" = "Espa\u00f1ol";

Когда мы извлекаем и назначаем метку, приложение отображает ее как «Espau00f1ol».

Не работает.

self.label1.text= NSLocalizedString(@"spanish-key", nil);

Работает - показывает в нужном формате.

self.label1.text= @"Espa\u00f1ol";

В чем может быть проблема, когда мы используем

NSLocalizedString(@"spanish-key", nil)?

Если мы установим \U вместо \u, тогда это сработает.

 "spanish-key" = "Espa\U00f1ol";

Когда использовать "\Uxxxx" и "\uxxxx"?


person Gaurav Borole    schedule 04.05.2014    source источник


Ответы (2)


NSString литералы и строковые файлы используют разные правила экранирования.

NSString литералы используют те же escape-последовательности, что и «обычные» C-строки, в частности «универсальные имена символов», определенные в стандарте C99:

\unnnn      - the character whose four-digit short identifier is nnnn
\Unnnnnnnn  - the character whose eight-digit short identifier is nnnnnnnn

Пример:

NSString *string = @"Espa\u00F1ol - \U0001F600"; // Español - ????

Строковые файлы, с другой стороны, используют \Unnnn для обозначения символа UTF-16 и «суррогатные пары UTF-16» для символов > U+FFFF:

"spanish-key" = "Espa\U00f1ol - \Ud83d\Ude00";

(Это экранирование используется в «списках свойств старого стиля», которые вы можете увидеть при печати описания `NSDictionary.)

Это (надеюсь) отвечает на ваш вопрос

Когда использовать «\Uxxxx» и «\uxxxx»?

Но: Как также отметил @gnasher729 в ​​своем ответе, вообще нет необходимости использовать escape-последовательности Unicode. Можно просто вставить сами символы Unicode, как в NSString литералы, так и в strings-файлы:

NSString *string = @"Español - ????";

"spanish-key" = "Español - ????";
person Martin R    schedule 04.05.2014
comment
Спасибо за отличное объяснение. Тем не менее, я хочу знать, какой метод рекомендуется, когда речь идет о файле строк локализации. Мы должны использовать escape-последовательности unicode, потому что уже готов файл strings, который содержит escape-последовательности unicode. Можно ли получить ссылку на документ Apple, где упоминаются эти вещи? - person Gaurav Borole; 04.05.2014
comment
@GauravBorole: рекомендуется в developer.apple .com/library/ios/documentation/MacOSX/Conceptual/, что файлы строк сохраняются в кодировке UTF-16, что означает, что вы можете использовать все символы без управляющей последовательности, как в "spanish-key" = "Español - ????";. Но это полностью ваш выбор, оба метода работают. - person Martin R; 04.05.2014
comment
@MartinR Хорошее объяснение, но каково решение, когда локализованная строка должна содержать escape-последовательность для символа Юникода, кроме ввода символа? - person Manuel; 02.09.2017
comment
Простое копирование и вставка персонажа работает даже с невидимыми символами; если вы перейдете в «Правка» > «Символы и эмодзи» и наберете U + xxxx в поиске, это позволит вам скопировать и вставить этот символ Unicode. (обратите внимание, что персонаж будет невидим, пока вы не нажмете на него в таблице символов). (Это необходимо в Swift, поскольку escape-последовательности Objective C рассматриваются как ошибка сборки в Swift, если вы определяете свои локализованные строковые значения в коде) - person DivideByZer0; 17.11.2017

Просто напишите строку в правильном Unicode в Localization.string.

"spanish-key" = "Español";
person gnasher729    schedule 04.05.2014