2011-01-06 78 views
5

我的Unicode字符的,我想“代码”列表使用\u转义序列(如\ue415)打印,只要我努力像这样的东西来撰写它:撰写的Unicode字符格式的NSString

// charCode comes as NSString object from PList 
NSString *str = [NSString stringWithFormat:@"\u%@", charCode]; 

编译器警告我关于不完整的字符代码。任何人都可以帮助我完成这个简单的任务吗?

+0

你想用给定的代码输出unicode符号? – Vladimir 2011-01-06 13:54:38

+0

是的,我已经尝试'%C'占位符没有运气。 – Eimantas 2011-01-06 14:05:24

回答

14

我认为你不能这样做你试图 - \ uxxx转义序列用于表明一个常量是一个Unicode字符 - 并且该转换在编译时处理。

你需要的是你的则charCode转换成整数,并使用该值作为格式参数:

unichar codeValue = (unichar) strtol([charCode UTF8String], NULL, 16); 
NSString *str = [NSString stringWithFormat:@"%C", charCode]; 
NSLog(@"Character with code \\u%@ is %C", charCode, codeValue); 

对不起,那NUST不能摆脱十六进制表示int值的最好方式,但是这即来到第一想到

编辑:看来,NSScanner类可以在十六进制表示扫描NSString对数:

unichar codeValue; 
[[NSScanner scannerWithString:charCode] scanHexInt:&codeValue]; 
... 
+0

真的有窍门!谢谢! – Eimantas 2011-01-06 14:24:13

+0

这非常有帮助!唯一的问题是我在第二行发出警告,因为显然unichar不是scanHexInt:函数的传递参数的有效类型。它仍然有效,但是是一个恼人的警告。 – Zebs 2011-05-28 21:51:59

+0

您需要使用一点字节操作才能使此NSScanner方法适用于更高的unicode值> UFFFF ...请参阅http://stackoverflow.com/a/15133359/2308190 – 2014-07-02 16:33:55

1

请注意,并非所有字符都可以用UTF-8编码。昨天我遇到了一些错误,其中有些韩文字符未能正确编码为UTF-8。

我的解决方案是将格式字符串从%s更改为%@并避免重新编码问题,尽管这可能对您不适用。

+0

正确,但此处使用utf-8只是为了将字符代码的字符串表示转换为其整数值,结果字符串本身可能需要被视为unicode字符串 – Vladimir 2011-01-06 14:51:01

+0

我遇到的问题是包含嵌入的空字符的错误的UTF-8编码,所以strtol不会给你什么正在期待。 – Mark 2011-01-06 15:38:17

+0

我想重新显示来自这个URL的表情符号字符:http://pukupi.com/post/1964/和弗拉基米尔的代码完成了这项工作。所以我想我已经超出了这个问题的范围。感谢您的输入! – Eimantas 2011-01-06 19:09:15

0

基于从@Vladimir代码,这个工作对我来说:

NSUInteger codeValue; 
[[NSScanner scannerWithString:@"0xf8ff"] scanHexInt:&codeValue]; 
NSLog(@"%C", (unichar)codeValue); 

不是由领导 “\ U” 或 “\\ U”,从API文档:

The hexadecimal integer representation may optionally be preceded 
by 0x or 0X. Skips past excess digits in the case of overflow, 
so the receiver’s position is past the entire hexadecimal representation.