Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在HITextView(MLTE)控件中显示UTF-8?_Macos_Unicode_Macos Carbon_Core Foundation - Fatal编程技术网

Macos 如何在HITextView(MLTE)控件中显示UTF-8?

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,

我有一个UTF-8字符串,我想在HITextView(MLTE)控件中显示它。理论上,HITextView需要“文本”或UTF-16,因此我转换为:

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:Re
HIViewSetText
,它可能会生成自己的副本(当您传递缓冲区时,我也会这样做)。每次更改字符串时,都需要设置视图的文本。(这也将与NSTextView的行为相匹配。)