NSString stringWithCString不显示特殊字符



我用

[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更快?

谢谢!

似乎%C格式不能与sprintf及其相关函数和非ascii字符一起工作。但有一个更简单的方法:stringWithCharacters:length:直接从unichar数组(UTF-16代码点)创建NSString。对于单个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); // 👻👹

最新更新