gpt4 book ai didi

cocoa - 提取 NSString 的第一个 Unicode 代码点(BMP 之外)的最简单方法?

转载 作者:行者123 更新时间:2023-12-03 16:13:47 26 4
gpt4 key购买 nike

由于历史原因,Cocoa 的 Unicode 实现是 16 位的:它通过“代理对”处理 0xFFFF 以上的 Unicode 字符。这意味着以下代码将不起作用:

NSString myString = @"𠬠";
uint32_t codepoint = [myString characterAtIndex:0];
printf("%04x\n", codepoint); // incorrectly prints "d842"

现在,这段代码在 100% 的情况下都能正常工作,但它却冗长得可笑:

NSString myString = @"𠬠";
uint32_t codepoint;
[@"𠬠" getBytes:&codepoint maxLength:4 usedLength:nil
encoding:NSUTF32StringEncoding options:0
range:NSMakeRange(0,2) remainingRange:nil];
printf("%04x\n", codepoint); // prints "20d20"

使用 mbtowc这段代码可以工作,但它仍然相当冗长,影响全局状态,不是线程安全的,并且可能会填满顶部的自动释放池所有这些:

setlocale(LC_CTYPE, "UTF-8");
wchar_t codepoint;
mbtowc(&codepoint, [@"𠬠" UTF8String], 16);
printf("%04x\n", codepoint); // prints "20d20"

是否有任何简单 Cocoa/Foundation 习惯用法可以从 NSString 中提取第一个(或第 N 个)Unicode 代码点?最好是只返回代码点的单行代码?

this otherwise excellent summary of Cocoa Unicode support中给出的答案(接近文章结尾)只是“不要尝试。如果您的输入包含代理对,请将它们过滤掉或进行其他操作,因为没有明智的方法来正确处理它们。”

最佳答案

单个 Unicode 代码点可能是代理对,但并非所有语言字符都是单个代码点。即并非所有语言字符都由一两个 UTF-16 单元表示。许多字符由 Unicode 代码点序列表示。

这意味着除非您正在处理 Ascii,否则您必须将语言字符视为子字符串,而不是索引处的 unicode 代码点。

获取索引 0 处字符的子字符串:

NSRange r = [[myString rangeOfComposedCharacterSequenceAtIndex:0];
[myString substringWithRange:r];

这可能是也可能不是您想要的,具体取决于您实际希望做什么。例如虽然这会给你“字符边界”,但它们不会对应于特定于语言的光标插入点。

关于cocoa - 提取 NSString 的第一个 Unicode 代码点(BMP 之外)的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12788691/

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