2017-09-10 4 views
-1

私のC#プログラムは、ユーザーからのテキスト入力を受け取り、Wikipediaに提案のためのWebリクエストを作成し、Win32 API関数ExtTextOut関数を使用して提案者をオーナー描画されたListViewに出力します。ベトナム語のExtTextOutを正しくレンダリングする方法

いくつかの提案はこのように、エンコードされ戻ってくる:

Abridged Chronicles of \\u0110\\u1ea1i Vi\\u1ec7t 

ので、私はこれを生成するためにSystem.Text.RegularExpressions.Regex.Unescape

を使用してそれらをデコード:そのリテラルベトナム文字で上記の文字列が、

Abridged Chronicles of Đại Việt 

TextBoxRichTextBox、およびVisual Studioのデバッガのどこでもうまくレンダリングされますが、正しく描画されませんenはExtTextOutによって送信されます。ここで

は、それがどのように見えるかです:すべての出力のために

[DllImport("gdi32.dll", EntryPoint = "ExtTextOutW")] 
public static extern int ExtTextOut(IntPtr hdc, int x, int y, int options, 
    ref RECT clip, String str, int len, IntPtr spacings); 

が、それだけでレンダリングされたアジア言語の文字:

enter image description here

私はWバージョンを使用するExtTextOutのための私のDllImport文を変更しようとしました。

私はWindowsコンピュータで言語オプションを調べましたが、それは問題を解決する適切な場所ではないようです。RichTextBoxは文字をうまく表現できるためです(Visual StudioとWebブラウザでWikipedia、そのことについては)。

私はこのように、文字列を変換しようとした:

byte[] utf8Bytes = Encoding.UTF8.GetBytes(str); 
byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); 
str = Encoding.Unicode.GetString(unicodeBytes); 

が、それは何もしませんでしたし、私は驚いていないよ、.NET、文字列に(私が間違っているなら、私を修正)ことを考えますメモリ内では常にUTF-16でエンコードされるため、上のコードは実際には何もしませんでした。

ExtTextOutを使用して文字を正しく表示するにはどうすればよいですか、別の方法が必要ですか?

+0

'ExtTextOut()'使用してのポイントは何ですか? .NETで 'Graphics.DrawString()'や 'TextRenderer'を使って同じことをすることができます。コードがうまくいかない場合は、問題を確実に再現する良い[mcve]を提供する必要があります。 –

+0

このサイトのメンバーは、自分の努力にもかかわらず、時にはより多くの批判に反応することがありますか?私は十分な準備をしていると思ったが、そのページについては知らなかったので、ありがとう。私はその質問を修正し、将来的にそれらを改善するでしょう。関数の選択については、私は何年も前にテキストレンダリングコードを書いていました。私は 'Graphics.DrawString()'と 'TextRenderer'に問題があったと思いますが、私は再訪して見ます。 –

答えて

0

まあ、解決策はCharset = Charset.Unicodeを追加したように見えます:

[DllImport("gdi32.dll", CharSet = CharSet.Unicode, EntryPoint = "ExtTextOutW")] 
public static extern int ExtTextOut(IntPtr hdc, int x, int y, int options, ref RECT clip, 
    String str, int len, IntPtr spacings); 
関連する問題