iOS本地化:形式为'\uxxxx'的Unicode字符转义序列不起作用

16

我们的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"?

2个回答

40

NSString 文本字面量和字符串文件使用 不同的转义规则

NSString 文本字面量使用与“普通” 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字符,对于大于U+FFFF的字符则使用"UTF-16代理对":

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

(这是在“旧样式属性列表”中使用的转义,当打印`NSDictionary`的描述时可以看到。)

(希望)这回答了你的问题。

何时使用“\Uxxxx”和“\uxxxx”?

但是:正如@gnasher729在他的回答中指出的那样,根本没有必要使用Unicode转义序列。您可以直接插入Unicode字符,无论是在`NSString`文字还是字符串文件中:

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

"spanish-key" = "Español - ";

感谢您的详细解释。但我仍想知道在本地化字符串文件方面推荐使用哪种方法。我们必须使用Unicode转义序列,因为已经准备好了包含Unicode转义序列的字符串文件。是否可能获取苹果文档参考,其中提到了这些内容? - Gaurav Borole
@MartinR 很好的解释,但是当一个本地化字符串应该包含一个Unicode字符的转义序列时,除了手动输入字符外,还有什么解决方案吗? - Manuel
只需复制粘贴字符,甚至对于不可见字符也适用;如果您进入“编辑”>“符号和表情符号”,并在搜索框中键入U + xxxx,则可以将该Unicode字符复制粘贴。 (请注意,在字符表格中单击该字符之前,该字符将是不可见的)。 (这在Swift中是必需的,因为如果您在代码中定义本地化字符串值,则Objective C转义序列会被视为构建错误) - DivideByZer0

4
只需在Localization.string中以适当的Unicode编写字符串即可。
"spanish-key" = "Español";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接