我正在使用
[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?
谢谢!
答案 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); //