NSString stringWithCString没有显示特殊字符?

时间:2016-11-04 19:26:52

标签: ios objective-c encoding character-encoding nsstring

我正在使用

[NSString stringWithFormat:@"%C",(unichar)decimalValueX];

但我必须称它为数千次而且它太慢了。

作为替代方案,我试过这个:

sprintf (cString, "%C", (unichar)decimalValueX);
[NSString stringWithCString:cString encoding:NSUTF16StringEncoding];

但没有正确转录任何字符。

如果我尝试UTF8而不是16:

sprintf (cString, "%C", (unichar)decimalValueX);
[NSString stringWithCString:cString encoding:NSUTF8StringEncoding];

我得到字母数字,但我没有外国字符或其他特殊字符。

任何人都可以解释发生了什么事吗?或者如何更快地使stringWithFormat?

谢谢!

1 个答案:

答案 0 :(得分:2)

似乎%C格式不适用于sprintf及相关函数和非ASCII字符。但是有一种更简单的方法: stringWithCharacters:length: 直接从NSString数组(UTF-16代码点)创建unichar。 对于单个unichar,这只是

NSString *string = [NSString stringWithCharacters:&decimalValueX length:1];

示例:

unichar decimalValueX = 8364; // The Euro character
NSString *string = [NSString stringWithCharacters:&decimalValueX length:1];
NSLog(@"%@", string); // €

多个UTF-16代码点的示例:

unichar utf16[] = { 945, 946, 947 };
NSString *string3 = [NSString stringWithCharacters:utf16 length:3];
NSLog(@"%@", string3); // αβγ

对于"基本多语言平面以外的角色" (即 字符> U + FFFF)您必须使用2个UTF-16代码点 每个字符(代理对)。 或者使用不同的API,例如

uint32_t utf32[] = { 128123, 128121 };
NSString *string4 = [[NSString alloc] initWithBytes:utf32 length:2*4 encoding:NSUTF32LittleEndianStringEncoding];
NSLog(@"%@", string4); //