2012-02-01 4 views
0

私は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でテストされています。

答えて

1

ConvertFromTextToUnicodeが期待する「テキスト」はおそらくMLTEの2つのオプションの1つである「テキスト」と同じです。 ConvertFromTextToUnicodeが変換されるような種類の「テキスト」があれば、直接MLTEに渡すことができます。代わりに

(記録のために、「テキスト」はMacRomanのか、どのようなユーザーのロケールに決定された現在のスクリプトによって決定されるか、ほぼ確実である。)

、あなたはテキストエンコーディングコンバータを使用する必要があります。完了したらCreate one,use it,finish using itおよびdispose of itとなります。

2つの方法があります。

は、create a CFString from the UTF-8にあり、次にGet its charactersです。 TECを使用する代わりにこれを実行します。それは機能的に同等で、おそらく少し簡単です。その一方で、コンバータを再利用することはできません。それは価値あるものです。

もう1つは、HITextViewがあるため、UTF-8とjust use thatからCFStringを作成することです。 Cocoaオブジェクトと同様に、HIToolboxオブジェクトには継承階層があります。 HITextViewは一種のHIViewなので、HIViewSetTextはうまく動作するはずです。 (そうでない場合は、HIViewSetValueを試してください)

最終的には、最終的にMLTE/HITextViewから遠ざかります。本質的にはwhat you'll do with an NSTextViewです。 (HITextViewとMLTEは非推奨です)

+0

変更可能な文字列の更新を尊重した場合、 'HIViewSetText'が理想的です。ここでの問題は、テキストが毎回追加され、大きくなることです。 'HIViewSetText'を試してみると、変更可能な文字列を与えるとその文字列に対する変更が無視されるようです。 'HITextView'に追加する唯一の方法は' TXNSetData'です。私は次に他の方法を試みます。 –

+0

CFStringを作成して文字を取得すると、その作業が完了したようです。興味深いのは 'CFStringGetCharactersPtr'は、元の文字列がすべてASCIIであるときには' NULL'を返すようですが、元の文字列に少なくとも1つの拡張Unicode文字が含まれていたときは 'UniChar []'へのポインタです。ですから、私は 'CFString'が見ている文字に応じて記憶域を最適化していると推測しています。 –

+0

@SethNoble:Re 'HIViewSetText'、それはおそらく独自のコピーを作成します(そして、あなたもバッファを渡すとこれが期待されます)。文字列を変更するたびに、ビューのテキストを設定する必要があります。 (これも、NSTextViewの動作と同じです。) –

関連する問題