Macos 如何在HITextView(MLTE)控件中显示UTF-8?
我有一个UTF-8字符串,我想在HITextView(MLTE)控件中显示它。理论上,HITextView需要“文本”或UTF-16,因此我转换为:Macos 如何在HITextView(MLTE)控件中显示UTF-8?,macos,unicode,macos-carbon,core-foundation,Macos,Unicode,Macos Carbon,Core Foundation,我有一个UTF-8字符串,我想在HITextView(MLTE)控件中显示它。理论上,HITextView需要“文本”或UTF-16,因此我转换为: UniChar uniput[STRSIZE]; ByteCount converted,unilen; err = ConvertFromTextToUnicode(C2UInfo, len, output, kUnicodeUseFallbacksMask, 0, NULL, 0,
UniChar uniput[STRSIZE];
ByteCount converted,unilen;
err = ConvertFromTextToUnicode(C2UInfo, len, output,
kUnicodeUseFallbacksMask, 0, NULL, 0, NULL,
sizeof(UniChar)*STRSIZE,
&converted, &unilen, uniput);
err=TXNSetData(MessageObject, kTXNUnicodeTextData, uniput, unilen, kTXNEndOffset,
kTXNEndOffset);
我已将转换器C2UInfo
定义如下:
UnicodeMapping uMapping;
uMapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeV2_0,
kUnicodeCanonicalDecompVariant,
kUnicode16BitFormat);
uMapping.otherEncoding = GetTextEncodingBase(kUnicodeUTF8Format);
uMapping.mappingVersion = kUnicodeUseLatestMapping;
err = CreateTextToUnicodeInfo(&uMapping, &C2UInfo);
它适用于普通的旧ASCII字符,但多字节UTF-8被映射到错误的字符。例如,æ(拉丁文小写字母AE)被映射到疆 (CJK统一表意文字-7586)
我曾尝试在Interface Builder中选中和取消选中“Output Text in Unicode”,并尝试更改一些转换常量,但没有效果
这是使用MacOSX10.5.sdk使用Xcode 3.2.6构建的,并在10.6下进行测试。ConvertFromTextToInocode期望的“文本”可能与MLTE的两个选项之一的“文本”相同。如果您有
convertfromtextoinicode
转换的那种“文本”,您可以直接将其传递给MLTE
(对于记录,“文本”几乎可以肯定是MacRoman或由用户的区域设置决定的当前脚本指定的任何内容。)
相反,您应该使用文本编码转换器,当你完成的时候
还有两种方法
一个是,那么。您可以这样做,而不是使用TEC。它在功能上是等效的,可能更容易一点。另一方面,你不能重复使用转换器,不管它值多少钱
另一个,因为您有一个HITextView,将从UTF-8和创建一个CFString。与Cocoa对象一样,HIToolbox对象具有继承层次结构;由于HITextView是一种HIView,HIViewSetText
应该可以正常工作。(如果没有,请尝试HIViewSetValue
)
最后一种方法也让您离最终离开MLTE/HITextView更近了,因为它本质上是。(HITextView和MLTE已被弃用。)
HIViewSetText
如果考虑对可变字符串的更新,将是理想的选择。这里的问题是文本每次都会被追加,并且会变大。在试验HIViewSetText
时,如果给它一个可变字符串,它似乎会忽略对该字符串的更改。添加到HITextView
的唯一方法似乎是TXNSetData
。接下来我将尝试其他方法。创建一个CFString,然后获取它的字符似乎就可以了。有趣的观察结果:CFStringGetCharactersPtr
似乎在原始字符串都是ASCII时返回NULL
(这是允许的),但在原始字符串至少包含一个扩展unicode字符时返回指向UniChar[]
的指针。因此,我推断,CFString
确实根据它看到的字符优化了它的存储,这很好。@SethNoble:ReHIViewSetText
,它可能会生成自己的副本(当您传递缓冲区时,我也会这样做)。每次更改字符串时,都需要设置视图的文本。(这也将与NSTextView的行为相匹配。)