gpt4 book ai didi

objective-c - 如何处理 NSString 中的 32 位 unicode 字符

转载 作者:太空狗 更新时间:2023-10-30 03:51:12 25 4
gpt4 key购买 nike

我有一个 NSString 包含一个大于 U+FFFF 的 unicode 字符,比如 MUSICAL SYMBOL G CLEF 符号 '𝄞'。我可以创建 NSString 并显示它。

NSString *s = @"A\U0001d11eB";  // "A𝄞B"
NSLog(@"String = \"%@\"", s);

日志是正确的,显示了3个字符。这告诉我 NSString 做得很好,没有编码问题。

    String = "A𝄞B"

但是当我尝试使用该方法遍历所有字符时

- (unichar)characterAtIndex:(NSUInteger)index

一切都出错了。

unichar 类型是 16 位,所以我希望得到错误的音乐符号字符。但是字符串的长度也不对!

NSLog(@"Length = %d", [s length]);
for (int i=0; i<[s length]; i++)
{
NSLog(@" Character %d = %c", i, [s characterAtIndex:i]);
}

显示

    Length = 4
Character 0 = A
Character 1 = 4
Character 2 = .
Character 3 = B

我应该使用什么方法来正确解析我的 NSString 并获得我的 3 个 unicode 字符?理想情况下,正确的方法应该返回类似 wchar_t 的类型来代替 unichar

谢谢

最佳答案

NSString *s = @"A\U0001d11eB";
NSData *data = [s dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
const wchar_t *wcs = [data bytes];
for (int i = 0; i < [data length]/4; i++) {
NSLog(@"%#010x", wcs[i]);
}

输出:

0x000000410x0001d11e0x00000042

(The code assumes that wchar_t has a size of 4 bytes and little-endian encoding.)

length and charAtIndex: do not give the expected result because \U0001d11e is internally stored as UTF-16 "surrogate pair".

Another useful method for general Unicode strings is

[s enumerateSubstringsInRange:NSMakeRange(0, [s length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
NSLog(@"%@", substring);
}];

输出:

A𝄞B

关于objective-c - 如何处理 NSString 中的 32 位 unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com