NSString stringWithCString 不显示特殊字符?

Posted

技术标签:

【中文标题】NSString stringWithCString 不显示特殊字符?【英文标题】:NSString stringWithCString not showing special characters? 【发布时间】:2016-11-04 19:26:52 【问题描述】:

我正在使用

[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】:

似乎%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); // ??

【讨论】:

使用NSInteger 代替unicharstringWithCharacters:(unichar*)... 如果length > 1 总体上可能会更好。 @l'L'l:我不这么认为。该方法需要一个unichar * 参数,指向length 类型为unichar 的元素。 我想你误会了,使用 NSinteger 表示 8364,然后在 stringWithCharacters: 语句中强制转换 unichar*。 @l'L'l:但是为什么呢? unichar 是一个 16 位整数。对于字符 > U+FFFF,您必须传递两个 unichar(代理对)的数组。或者您使用不同的 API(例如 initWithBytes:length:encoding:)。 @l'L'l:谢谢你的反馈,我已经更新了答案。

以上是关于NSString stringWithCString 不显示特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

NSString

NSString基本概念

将 NSString 转换为具有日期格式的 NSString 块

NSString 到 CFStringRef 和 CFStringRef 到 ARC 中的 NSString?

NSString 转换 UTF8

iOS-将NSString转换成UTF8编码的NSString