
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;
}
この回答への補足
有用なご返答ありがとうございます。
実はいろいろ試したところ、MFCのエディットボックスではUTF8からUTF16へ先に示したコードで処理した文字列が正常に表示できました。なぜかリストコントロールで激しく文字化けします。この理由がわかりません。
いろいろありがとうございました。とりあえず私にとっては驚愕の事実とともに自己解決いたしました。
なにが驚きかというと、ダイアログでフォントを設定しますが、コントロールの種類によって、同じフォントをつかっていても文字化けするものとしないものがあるということです。
ためしにメイリオをダイアログのフォントに設定しやってみたところ、難なくきれいに表示されました。MSUIGothicだったかなんだか忘れてしまいましたが、少なくとも私が試した中では、エディットボックスとリストコントロールで同じフォントでも文字化けするしないに分かれました!
まっっっっったく知りませんでしたw しかし試してみるものです。
No.1
- 回答日時:
後半だけ。
Windowsのコントロールに文字列を取得/表示したりするAPIは
UnicodeもしくはANSI文字列(日本語ならCP932)になります。
よって、UTF-8のコードの配列を渡しても文字化けすることになるでしょう。
よって、UTF-8→Unicode変換する必要があります。
MultiByteToWideChar
というAPIを使えば、変換できます。
http://msdn.microsoft.com/ja-jp/library/cc448053 …
BOMはとらないといけないかもしれませんが。
この回答への補足
ご返答ありがとうございます。その方法は試しました。そうすると確かにデバッグ画面で変数の中身をウォッチすると正常なユニコード文字列が読める形で見れます。ここでは「(ハード)」を用いました。
しかし、これをそのままコントロールの文字列として代入すると文字化けします。今回はリストコントロールのアイテムの文字列として入れています。
以下のことを試したのですが、文字化けしないケースと文字化けするケースがありました。
■エディットボックスから「(ハード)」を入力⇒その値を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;
}
どうもありがとうございました。
うえに書いたように自己解決しました。結果は私としてはかなりおどろきでしたw
ちなみに環境は
VisualStudio2008Professional、Win7x64、UNICODEコンパイル
です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Win32APIでのエディットボックスの文字化け
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
-
4
CString から LPCTSTRの型に変換
C言語・C++・C#
-
5
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
6
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
7
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
8
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
9
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
10
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
11
CFileDialogでフォルダだけを選択させる
C言語・C++・C#
-
12
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
13
子ダイアログのデータを親ダイアログで取得するには
C言語・C++・C#
-
14
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
15
エディットボックスのフォントを変えたい
C言語・C++・C#
-
16
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
17
文字列の置換をCStringで(C++)
C言語・C++・C#
-
18
ATLとMFCの違いは何でしょうか?
C言語・C++・C#
-
19
エディットコントロールへのUnicodeの入力
C言語・C++・C#
-
20
CStringをwchar_tに変換したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8でソースを書くとエラーに...
-
文字コードの%E3%80%とは何です...
-
フォントの色を保持したままセ...
-
CSVファイルの中で、「 , 」カ...
-
VBA 文字に半角が含まれて...
-
データにカンマが入ったCSVデー...
-
「abcで始まらない」を正規表現...
-
Excel 住所の分割(文字数制限...
-
openoffice calcで#DIV/0! の...
-
「一角」って何でしょうか
-
「何とかで始まり、何とかで終...
-
IEからEdgeへの移行に伴うIMEの...
-
gccでiconvを使った文字コード...
-
16進数の文字列を文章に変える
-
ローマ字文字列の半角←→全角変換
-
VBA 置換文字がみつからない時
-
COBOL・全角判定
-
CString から LPCTSTRの型に変換
-
EXCELからCSVにすると余計なカ...
-
メモ帳からエクセルにセル区切...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MFCのコントロールにUTF-8の文...
-
perl でエラー:Wide character...
-
【LaTeX】pBibTeXでのエラーの...
-
【文字コード】外見上は全く同...
-
perlについての質問
-
pythonの文字コードとファイル操作
-
printfの書式指定での2バイト文...
-
UTF-16からUTF-8への変換
-
WindowsでUTF-8のPerlスクリプ...
-
jcode.plのかわり
-
Perlで、文字の出現回数を調べ...
-
Jcodeによるカタカナ→ひらがな変換
-
オブジェクト? perlをオーバー...
-
デバッグ情報が文字化けする
-
Perlにおけるパターンマッチ
-
カタカナ一覧表が知りたい
-
漢字コードについて
-
Encode と encoding の同時使用...
-
sedやperlでの2バイト文字を含...
-
perlのlwp::simpleのgetのprint...
おすすめ情報