私はHITextView(MLTE)コントロールで表示したいUTF-8文字列を持っています。理論的には、HITextViewは、 "テキスト" またはUTF-16のいずれかが必要ですので、私は変換しています:HITextView(MLTE)コントロールにUTF-8を表示するには?
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は間違った文字にマップされています。たとえば、((LATIN SMALL LETTER AE)は((CJK UNIFIED IDEOGRAPH-7586)にマップされています。
私はInterface Builderで「出力テキストをUnicodeで」チェックしてみましたが、いくつかの変換定数を変更しても何の効果もありませんでした。
これはMacOSX10.5.sdkを使用してXcode 3.2.6で構築され、10.6でテストされています。
変更可能な文字列の更新を尊重した場合、 'HIViewSetText'が理想的です。ここでの問題は、テキストが毎回追加され、大きくなることです。 'HIViewSetText'を試してみると、変更可能な文字列を与えるとその文字列に対する変更が無視されるようです。 'HITextView'に追加する唯一の方法は' TXNSetData'です。私は次に他の方法を試みます。 –
CFStringを作成して文字を取得すると、その作業が完了したようです。興味深いのは 'CFStringGetCharactersPtr'は、元の文字列がすべてASCIIであるときには' NULL'を返すようですが、元の文字列に少なくとも1つの拡張Unicode文字が含まれていたときは 'UniChar []'へのポインタです。ですから、私は 'CFString'が見ている文字に応じて記憶域を最適化していると推測しています。 –
@SethNoble:Re 'HIViewSetText'、それはおそらく独自のコピーを作成します(そして、あなたもバッファを渡すとこれが期待されます)。文字列を変更するたびに、ビューのテキストを設定する必要があります。 (これも、NSTextViewの動作と同じです。) –