获取NSString的Unicode点并将其放入另一个NSString中

4

如何从 NSString 中获取 Unicode 值?例如,

NSString *str = "A";
NSString *hex;

现在,我想将hex的值设置为str的Unicode值(即0041)... 我应该如何做到这一点?

2个回答

6
unichar类型被定义为16位unicode值(例如,间接记录在%C说明符的描述中),您可以使用characterAtIndex:NSString的特定位置获取unichar,或者使用getCharacters:range:如果您想要比一次查询更快地从NSString中填充unichar的C数组。

NSUTF32StringEncoding也是一种有效的字符串编码方式,还有一些特定于字节顺序的变体,以防您希望绝对未来。您可以使用更繁琐的getBytes:maxLength:usedLength:encoding:options:range:remainingRange:获取这些的C数组。

编辑:例如

NSString *str = @"A";

NSLog(@"16-bit unicode values are:");
for(int index = 0; index < [str length]; index++)
    NSLog(@"%04x", [str characterAtIndex:index]);

嗯,感谢您的迅速回复,但是我对Obj-C还比较新。您能提供一段代码片段/示例用法吗? - citruspi
当我执行codeNSString *hexValue = [NSString stringWithFormat:@"%C", @"<"];code时,我得到了棰。 - citruspi
这是因为@"<"是一个字符串,因此是一个对象,但%C需要一个文字。你不幸地掉进了Objective-C的面向对象世界和C的字面值老世界之间的断层线。您将使用%@来指定一个对象,或使用'<'来作为字面量放置一个字符 - 虽然在这两种情况下,你需要注意一般,因为源代码中的Unicode字符不一定会在编译中保留(尽管NSString完全理解Unicode;这是一个工具链问题而不是运行时问题)。 - Tommy
好的,谢谢Tommy!我已经确认你的答案是正确的。编辑:我也想点赞,但显然我需要15个声望...希望其他用户能看到巨大的勾号! - citruspi
1
仅供参考:从语义上讲,“unichar”是UTF-16字符,而不是Unicode代码点。它们大致匹配,但并不完全相等。 - eonil

3

您可以使用

NSData * u = [str dataUsingEncoding:NSUnicodeStringEncoding];
NSString *hex = [u description];

你可以将NSUnicodeStringEncoding替换为NSUTF8StringEncoding、NSUTF16StringEncoding(与NSUnicodeStringEncoding相同)或NSUTF32StringEncoding,或许多其他值。
更多信息请参见此处

很酷的替代方法;值得注意的是,NSData 包含一个单一的原子内存块,保存相关数据,因此您可以获取其 bytes 属性并适当地将其转换为 C 数组以进行遍历。只需注意 length 即可。因此,这比根据我的答案分配自己的缓冲区并使用 getBytes:maxLength:... 来获取 32 位 UTF 代码数组的方法要干净得多。 - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接