• ベストアンサー

MFCのコントロールにUTF-8の文字を表示したい

MFCのコントロールにUTF-8の文字を表示したい 表題の件ですが、VisualStudio2008において、UTF-8+BOMフォーマットで保存したソースコードにBOMつきUTF-8を入力する方法と、UTF-8文字列をMFCのコントロール(リストコントロールなど)に表示する方法がわかりません。 どなたかご教授いただける方が居られましたら幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

とりあえず、受信している文字列はちゃんとBOMつきUTF-8の文字列になっていますか? ちなみにこんなコードではうまく変換出来ているようです。 #include <windows.h> #include <string> std::wstring ConvUTF8toUni(std::string utf8str) // BOMをとるため非const { std::wstring unistr; // BOM とり if (utf8str.length() > 3) { if ((unsigned char)utf8str[0] == 0xEF && (unsigned char)utf8str[1] == 0xBB && (unsigned char)utf8str[2] == 0xBF) { utf8str.erase(0, 3); } } int len = ::MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), -1, NULL, 0); if (len > 0) { unistr.resize(len); ::MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), -1, &unistr[0], len); } return unistr; } int main() { unsigned char utf8[] = { 0xEF, 0xBB, 0xBF, // BOM 0xE3, 0x81, 0x82, // あ 0xE3, 0x81, 0x84, // い 0xE3, 0x81, 0x86, // う 0xE3, 0x81, 0x88, // え 0xE3, 0x81, 0x8A, // お }; std::string utf8str((char*)utf8, _countof(utf8)); std::wstring unistr = ConvUTF8toUni(utf8str); return 0; }

crysis5375
質問者

お礼

いろいろありがとうございました。とりあえず私にとっては驚愕の事実とともに自己解決いたしました。 なにが驚きかというと、ダイアログでフォントを設定しますが、コントロールの種類によって、同じフォントをつかっていても文字化けするものとしないものがあるということです。 ためしにメイリオをダイアログのフォントに設定しやってみたところ、難なくきれいに表示されました。MSUIGothicだったかなんだか忘れてしまいましたが、少なくとも私が試した中では、エディットボックスとリストコントロールで同じフォントでも文字化けするしないに分かれました! まっっっっったく知りませんでしたw しかし試してみるものです。

crysis5375
質問者

補足

有用なご返答ありがとうございます。 実はいろいろ試したところ、MFCのエディットボックスではUTF8からUTF16へ先に示したコードで処理した文字列が正常に表示できました。なぜかリストコントロールで激しく文字化けします。この理由がわかりません。

その他の回答 (1)

回答No.1

後半だけ。 Windowsのコントロールに文字列を取得/表示したりするAPIは UnicodeもしくはANSI文字列(日本語ならCP932)になります。 よって、UTF-8のコードの配列を渡しても文字化けすることになるでしょう。 よって、UTF-8→Unicode変換する必要があります。 MultiByteToWideChar というAPIを使えば、変換できます。 http://msdn.microsoft.com/ja-jp/library/cc448053.aspx BOMはとらないといけないかもしれませんが。

crysis5375
質問者

お礼

どうもありがとうございました。 うえに書いたように自己解決しました。結果は私としてはかなりおどろきでしたw ちなみに環境は  VisualStudio2008Professional、Win7x64、UNICODEコンパイル です。

crysis5375
質問者

補足

ご返答ありがとうございます。その方法は試しました。そうすると確かにデバッグ画面で変数の中身をウォッチすると正常なユニコード文字列が読める形で見れます。ここでは「(ハード)」を用いました。 しかし、これをそのままコントロールの文字列として代入すると文字化けします。今回はリストコントロールのアイテムの文字列として入れています。 以下のことを試したのですが、文字化けしないケースと文字化けするケースがありました。 ■エディットボックスから「(ハード)」を入力⇒その値をCStringWに代入⇒リストコントロールのアイテムに設定⇒文字化けしない ■UTF8を使っているWebからの「(ハード)」を受信⇒その値をstd::stringに代入⇒APIで変換⇒wstringに代入⇒リストアイテムのテキスト(LPTSTR=wchar_t*)に代入⇒文字化け という具合です。MFCのコントロールとMFCのAPIやCStringを介してやっている分には問題ないようです。BOMの有無とかでしょうか? マルチバイト文字列からワイド文字列への変換には以下のような関数を用いました。 std::wstring ConvertMultiToWide( std::string const &str ) { int sizeWide = ::MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0 ); if( sizeWide == 0 ) return L""; std::wstring wstr; wstr.resize(sizeWide); ::MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &wstr[0], sizeWide ); return wstr; }

関連するQ&A

  • VC++でUTF-8のファイルを出力したい

    VisualStudio2005で以下のコードを実行したとき、ファイルをUTF-8で作成したいのですが、なにか方法がありますか? 現状では、SJISで出力されてしまいます。 ソースは、『ファイル』-『保存オプションの詳細設定』で『UTF-8(BOM付き)』にしてあります。 #include <stdio.h> int main(int argc, char* argv[]) {     FILE *fp;     fp = fopen( "c:/temp/log.txt", "w");     fprintf( fp, "%s\n", "あいうえお" );     fclose( fp );     return 0; } ちなみに、”あいうえお”の部分を(EmEditorで)SJISに無くてUTF-8にだけ存在する文字にした場合、VisualStudioのエディタ上では正しく文字が表示されます。 したがって、VisualStudio内ではリテラルの文字コードはUTF-8で扱われていると考えられます。・・・が、上記プログラムで出力すると文字化けします。つまり、SJISで出力されてしまいます。 ご教授のほど、よろしくお願いいたします。

  • 文字コード【utf-8】のHTMLを

    charset=utf-8で作成されているHTMLをDreamweaverで開くと テキストが文字化けしてしまいます。 他のテキストエディタで文字コードをUnicodeに設定して開いた場合も Web上で「ソースコードの表示」でソース表示してもやはり同じく文字化けしてしまいます。 この場合、どうしたら文字化けせずにソースを表示することができますか? できればDreamweaverで開けるとありがたいのですが・・・ アドバイスいただけると助かります。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • HTML
  • JSPでUTF-8の文字列表示

    JSPでUTF-8の文字列を表示することができず困っています。 HTMLの<form>でPOSTした任意の文字列をjspでUTF-8の文字列に変えたいのですが、 いろいろ試したのですがどうもうまくできません。 jspは全然くわしくないので困ってます。 以下のようなHTMLで <body> <h1 style="background:#cccccc;width:60%">文字コード変換したい文字列を入力</h1> <br> *UTF-8に変換します。 <form method="POST" action="moji2.jsp"> <textarea name="enco" cols="60" rows="7"></textarea> <br /> <input type="submit" value="変換" /> </form> </body> 以下のようなJSPファイルで <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.net.*" %> <% request.setCharacterEncoding("Windows-31J"); %> <% String en = request.getParameter("enco"); String ren = URLEncoder.encode(en); %> <%=ren %> となまぁただUTF-8の文字列を表示をする勉強をしていたのですがいろいろかえてもShift_JISでエンコードされた文字列が表示されます。 例)あいうえお で入力すると %82%A0%82%A2%82%A4%82%A6%82%A8 やりたいことはこのサイトと同じことなんです http://www.tagindex.com/tool/url.html 例)あいうえお %e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a 最終目標は任意の文字列をUTF-8に変換して、ヤフーの形態素解析をすることです。初心者ですがよろしくお願いします。。

    • ベストアンサー
    • Java
  • 3バイト文字(UTF-8)をprintfで等幅表示をするには?

    64BIT環境のLINUX、gcc で開発をしております。 表題の件ですが、UTF-8 は3バイト文字が多いため、strlenの戻り値と、printf で表示したときの画面上の桁数が一致しません。 そのため、下記のようなプログラムを実行すると >> int main() { char* s = "あいうえお"; printf("%20s\n", s); return 0; } ... あいうえお << と、画面上で15桁で表示されます。 つまり、文字列中のUTF-8の文字数分、表示幅がフィールド幅より短くなるわけです。 現状、文字列中の UTF-8文字の数を数える関数を作成し、以下のように対処しております。 >> int strUTF8Count(const char* s) { int notAsciiCount = 0; while(*s++) { if (!isascii(*s)) ++notAsciiCount; } return notAsciiCount / 3; } int main() { char* s = "あいうえお"; printf("%*s\n", 20 + strUTF8Count(s), s); return 0; } << これで、現状動いておりますが、strUTF8Count関数の作りが雑で、ascii でなければ UTF-8 と仮定しているし、UTF-8 であれば、3バイト文字と仮定してしまっています。 printf もかなりみづらいですし、何かもっとスマートな方法はないものでしょうか? UTF-8 の扱いとしては一般的なものと思われますが、ネット上を検索しても有効な対処が見つかりませんでした。 どなたかよい知恵をお持ちの方がいらっしゃいましたら、知恵を分けてくれるようお願いします。

  • 文字コードがUTF8のため、トップページが表示されない。

    昨年10月にMovable Typeを用いて、ブログを作成しているのですが、文字コードがUTF-8のためトップページを表示する際に、エンコードで文字コードの設定を自動選択にするか、UTF-8に設定しなおさないと、表示されません。多くの方がIEの標準の設定でShift-Jisで設定されているので、設定をしなおさないと表示することができません。 ソース上で、自動的に表示させるようにすることはできるのでしょうか? music-addict.net/world/

  • UTF-8のBOM無し保存

    現在Ubuntu8.10を利用しています。 普段プログラムを書くのにgeditを使ってるのですが、PHPやTclを書く時にBOMによるエラーが出てしまいます。 調べて見たところ、既に記述されたファイルからBOMを取り除く方法等は紹介されていますし、Windowsのメモ帳等でBOM無しで保存する方法は見つかるのですが、geditでファイルを保存するとき、BOM無しのUTF-8を既定の文字コードに設定することって出来ないのでしょうか? vimやemacsを使う方が無難でしょうか。。。

  • UTF-8の文字コードをIE5で表示するには

    UTF-8の文字コードをMACのIE5で表示するにはどのようにすればいいのでしょうか?

    • ベストアンサー
    • Mac
  • UTF-8での保存について

     エディットボックスに入力してある日本語の文字列をUTF-8やUTF-8Nでテキストファイルに保存したのですがうまくいきません。  UTF-8の場合はファイルの先頭に3バイトのBOMをつければいいらしいので、 ファイルの先頭に0xEF,0xBB,0xBFの3バイトを追加してテキストファイルに保存しましたがメモ帳で開くと文字化けします(メモ帳で開くときは文字コードをUTF-8にして開いてます)。 作成したテキストファイルをバイナリエディタで開いてみると先頭の3バイトはEFBBBFとなっているので何も問題はないと思うのですが、どうして文字化けするファイルができてしまうのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • PythonでUTF8の文字列をリストに入れると文字化けする

    PythonでUTF8の文字列をリストに入れると文字化けして、困っています。 以下、サンプルコードです。 a='あ' print a cmd=[] cmd.append(a) print cmd 結果は以下のようになります。 あ ['\xe3\x81\x82'] 文字化けしないようにリストに格納するにはどうすればよいでしょうか。 また、最終的にやりたいことは、リストの内容をLinuxのコンソールに出力することです。 Linux上で、$'\xe3'$'\x81'$'\x82'とすると'あ'という風に認識してくれるので、このようにリストに格納されれば良いと思っているのですが、良い方法はあるでしょうか。 よろしくお願いします。

  • UTF-8のXMLがSJISのPHPで文字化け

    携帯サイト用にShift-JISで書いたPHPページにて、以下のように外部XMLファイル(UTF-8)をロードしていますが文字化けしてしまいます。 <?php $list = simplexml_load_file('test.xml'); echo ($list->data[0]->name); echo ($list->data[0]->tel); echo ($list->data[0]->address); ?> 各ファイルの文字コードはそのままで、文字化けせずにデータを表示することは可能でしょうか?php.iniなどの設定変更をする権限もないので、ソースコードレベルでの解決策を探しています。 勉強不足で恐縮ですが、私はPHPに詳しくないため、なるべく具体的なソースコードをご提示いただいた上で対策をご教授いただけると助かります。 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう