如何在我的Objective-C源代码中转义Unicode字符?

39

我觉得很蠢,因为我找不到相关文档和Google没有任何帮助。

我有一个Unicode字符,想要将它插入到我的iPhone应用程序源代码中的字符串文字中。我知道它的十六进制值。请问应该使用什么适当的转义序列?另外,我忽略了哪些明显的信息来源会告诉我这个问题的答案?


Swift的类似问题/答案:https://dev59.com/LF0Z5IYBdhLWcg3wlRMV - Suragch
5个回答

67

示例:

NSString *stuff = @"The Greek letter Beta looks like this: \u03b2, and the emoji for books looks like this: \U0001F4DA";

3
您无需转义它。默认情况下,编辑器和编译器工具链将把源代码文件解释为UTF8。您可以在字符串常量中使用任何Unicode字符。这在Mac OS X 10.5之前的工具链中并不成立。 - Ken
请注意,这仅适用于UTF-8。对于所有代码点(例如需要UTF-16的表情符号U+1F638),@MarcCharbonneau的基于%C的答案有效(例如...Format:@"%C", 0x1F638)。 - Ky -
@EvgenBodunov 但是你如何在NSString字面量中实现它? - Ky -
@Supuhstar 请阅读有关UTF-8的维基百科。UTF-8中的字符大小可能不同,例如英文字母为1个字节,俄语则为2个字节,表情符号则为3个字节等。NSString本地支持UTF-8字符串。因此,您可以编写@"eng фя ",然后将其保存为NSData并检查以字节为单位的大小。 - Evgen Bodunov
1
@Supuhstar,我是你回答的三个点赞者之一。但是你说猫表情符需要UTF-16编码,我不同意。它只需要更长的转义序列。有两种转义序列:短的\uxxxx(两个字节)和长的\Uxxxxxxxx(四个字节)。@"\U0001F638"更长的序列显示猫。 - Evgen Bodunov
显示剩余3条评论

11

如果您不想直接将它放入字符串中,您可以像这样使用格式说明符:

[string stringByAppendingFormat:@"%C", 0x2665];

4

一种更现代的方法:

我不确定这个特性是何时添加到语言中的,但至少在2015年,Objective-C字符串字面值可以包含任何Unicode字符。例如,我使用表情符号标记我的日志行,因为它们独特的颜色是我更容易识别它们的一种方式:

message:@" \n \n\t‼️ 错误:%@"

因此,如果你拥有字符而不仅仅是代码点,并且想要在静态字符串中使用它而不是动态生成它,这是一个很好的方法,因为你可以通过查看它来立即了解正在使用的字符。


1
这一直是事实,对于“一直”的价值至少可以追溯到LLVM的引入,甚至更早。 - Becca Royal-Gordon

1

适当的转义序列应该是类似于

wchar_t * str = L"\x0627";

请参考这个问题:字符常量:\000 \xhh

编辑:哦,抱歉,我错过了iPhone和Objective-C标签。上述内容适用于通用的C/C++,但我没有涉及iPhone开发,所以可能会有所不同。


1
它可以工作:在Objective-C中,UTF-16使用"\u0024",UTF-8使用"\x24";在Swift中,分别使用"\u{0024}"和"\u{24}"。我的回复不涉及宽字符。 - tontonCD
耶,也适用于unichar和字符字面量,例如 unichar x = L'•';。(如果您正在使用NSString并且getCharacters/stringWithCharacters)这很好。 - nevyn

-4

\是Objective-C中的转义字符,使用它来转义需要转义的字母,例如:

NSString temp = @" hello \"temporary.h\" has been inported";

在这里,如果你将temp字符串打印到textview或日志中,你会看到"也被打印出来了,因为我们在它们之前使用了转义字符\


这并没有回答问题,因为它没有解释\转义字符如何允许您插入Unicode字符。 - Ky -

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