0

我已经获得了将属性应用于字符串的范围。挑战在于范围以 UTF-32 代码单元提供。

是 1 个 UTF-32 代码单元,但 NSString 将其视为长度 2,因为它是两个 UTF-16 代理对字符的组合字符。

另一方面,^ิ 是 2 个 UTF-32 代码单元,NSString 也将其视为长度为 2。

我可以找到在非组合和组合之间转换的简单方法。在 UTF-16 和字素之间——但不是在 16 到 32 个代码单元之间。

我认为问题与询问相同:是否有一种简单的方法可以从 Mac OS X 和/或 iOS 上的其他组合字符中检测代理对?

4

1 回答 1

2

的抽象NSString是UTF-16“字符”。如果你想要 UTF-32,那么从 Cocoa 的角度来看,它不再是一个字符串;它是一个数据缓冲区。所以,你要找的是:

NSData* utf32Data = [someString dataUsingEncoding:NSUTF32StringEncoding];
uint32_t* utf32 = (uint32_t*)[utf32Data bytes];
NSUInteger count = [utf32Data length] / sizeof(utf32[0]);

然后遍历数组的count元素。utf32


NSString这是用于转换范围的未经测试的类别:

@interface NSString (UTF32Range)

- (NSRange) rangeFromUTF32Range:(NSRange)range;

@end

@implementation NSString (UTF32Range)

- (NSRange) rangeFromUTF32Range:(NSRange)range
{
    NSUInteger len = self.length;
    NSUInteger i = 0;
    while (i < range.location && i < len)
    {
        unichar u = [self characterAtIndex:i];
        if (CFStringIsSurrogateHighCharacter(u))
        {
            range.location++;
            i++;
        }
        i++;
    }
    while (i < range.length && i < len)
    {
        unichar u = [self characterAtIndex:i];
        if (CFStringIsSurrogateHighCharacter(u))
        {
            range.length++;
            i++;
        }
        i++;
    }

    return range;
}

@end
于 2013-02-12T03:36:56.937 回答