你有几个合理的选择。
1. 转换
第一种方法是将你的UTF32转换为UTF16并与NSString一起使用,因为UTF16是NSString的“本地”编码。这并不是特别难。如果UTF32字符在BMP中(例如,它的高两字节为0),你可以直接将其强制转换为unichar
。如果它在任何其他平面上,则可以将其转换为UTF16字符对的代理项。你可以在维基百科页面找到相关规则。但是一个快速的(未经测试的)转换看起来像这样:
UTF32Char inputChar = // my UTF-32 character
inputChar -= 0x10000
unichar highSurrogate = inputChar >> 10
highSurrogate += 0xD800
unichar lowSurrogate = inputChar & 0x3FF
lowSurrogate += 0xDC00
现在您可以同时使用两个字符创建一个NSString:
NSString *str = [NSString stringWithCharacters:(unichar[]){highSurrogate, lowSurrogate} length:2];
要倒序处理,可以使用 [NSString getCharacters:range:]
获取 unichar,然后反转代理对算法以获取 UTF32 字符(任何不在范围 0xD800-0xDFFF
内的字符应直接转换为 UTF32)。
2. 字节缓冲区
您还有另一种选择,即让 NSString 直接进行转换而不使用 cStrings。要将 UTF32 值转换为 NSString,可以使用以下代码:
UTF32Char inputChar = // input UTF32 value
inputChar = NSSwapHostIntToLittle(inputChar)
NSString *str = [[[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding] autorelease]
要再次获取它,您可以使用
UTF32Char outputChar;
if ([str getBytes:&outputChar maxLength:4 usedLength:NULL encoding:NSUTF32LittleEndianStringEncoding options:0 range:NSMakeRange(0, 1) remainingRange:NULL]) {
outputChar = NSSwapLittleIntToHost(outputChar); // swap back to host endian
// outputChar now has the first UTF32 character
}
CFStringGetSurrogatePairForLongCharacter
,考虑重写我的答案来包括它,但听起来你已经知道如何使用它了。 - Lily BallardNSUTF32StringEncoding
没有声明它的字节序。在小端机器上(例如现代 Mac),您可以使用NSUTF32LittleEndianStringEncoding
。您还可以使用NSSwapHostIntToLittle()
来确保输入以小端格式呈现。 - Lily Ballard