CoreFoundation UTF-16非配对代理

时间:2015-06-17 19:13:16

标签: unicode utf-8 utf-16 core-foundation

我尝试使用Apple Core Foundation API从utf16编码说utf32:

cfString = CFStringCreateWithBytes(nullptr, str, strLen, kCFStringEncodingUTF16, FALSE);

auto range = CFRangeMake(0, CFStringGetLenth(cfString));

CFStringGetBytes(cfString, range, kCFStringEncodingUTF32, 0, false, buffer, bufferSize, usedsize); 

大部分时间都有效,直到输入缓冲区包含代理对的第一部分说U + df9f,Corefoundation只返回输出而没有不正确的字符。

因此要符合一点unicode,我必须手动确定这种情况,并按照unicode文档创建U + FFFD形式的标准替换:http://www.unicode.org/versions/Unicode6.0.0/ch03.pdf

其他编码的情况相同:如utf-8中间的符号0x80,则CFStringCreateWithBytes始终返回nullptr而不是指向无效字符。

是预期的行为还是Corefoundation的UB,或者可能有一个提示要调整CF以某种方式报告格式错误的输入?

更新:

我完全遵循了:

UInt8 str[] = {0x41, 0x00, 0x9f, 0xdf}; // coresponding to unicode A + invalid surogate pair

CFStringRef mystr = CFStringCreateWithBytes(nullptr, str, 4, kCFStringEncodingUTF16, false, FALSE);

之后mystr根据CFStringGetLength()有2个字符len,所以看起来无效的char被处理

std::vector<char> str(7);
CFStringGetCString(mystr, &*str.begin(), str.size(), kCFStringEncodingUTF8);

这给了我假,所以不可能转换为utf8,并且Xcode调试监视器不显示字符串myStr。 因此输出对于utf8和c-string都没有,之后我通过get bytes routine转换为utf-32进行检查

result = CFStringGetBytes(s, range, kCFStringEncodingUTF32BE, 0, false, buffer,  bufferSize, usedSize);

它为我提供usedSize=4result=1,输出包含0x0041,因此只转换了一个符号。所以这就是为什么我认为没有替换发生畸形的surogate对。

0 个答案:

没有答案