
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
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
10
CEdit の内容が変わった時にメッセージを表示させたい
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
CStringをwchar_tに変換したい
C言語・C++・C#
-
19
エディットコントロールへのUnicodeの入力
C言語・C++・C#
-
20
ATLとMFCの違いは何でしょうか?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl でエラー:Wide character...
-
【文字コード】外見上は全く同...
-
エクセルで数値を全角文字(カ...
-
住宅にカナを入力する際に丁目...
-
VBA 文字に半角が含まれて...
-
CSVファイルの中で、「 , 」カ...
-
word差し込み印刷 半角カタカ...
-
EXCELからCSVにすると余計なカ...
-
マクロを使ってフォルダー内に...
-
文字コードの%E3%80%とは何です...
-
エクセルの区切り位置の設定方法
-
WORDで改ページすると時々グレ...
-
秀丸エディタで、「-」や「ー」...
-
Excelについて質問です。 セル...
-
IEからEdgeへの移行に伴うIMEの...
-
漢数字の変換
-
C言語でテキストファイルの内容...
-
数字が全角、コンマなし
-
海外のケータイ(GSM携帯)はハ...
-
カンマ区切りの数字をCSVフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl でエラー:Wide character...
-
MFCのコントロールにUTF-8の文...
-
【文字コード】外見上は全く同...
-
perlについての質問
-
perlで読み込むテキストの文字...
-
jcode.plのかわり
-
Jcodeによるカタカナ→ひらがな変換
-
UTF_16で取得しUTF_8で出力した...
-
CGIでメール送信で件名文字化け
-
【LaTeX】pBibTeXでのエラーの...
-
機種依存文字(株)を入力すると\...
-
数字を1桁なら半角、2桁以上...
-
UTF-16からUTF-8への変換
-
sedやperlでの2バイト文字を含...
-
printfの書式指定での2バイト文...
-
WindowsでUTF-8のPerlスクリプ...
-
EC-CUBEでの文字化け
-
デバッグ情報が文字化けする
-
{ブロック}の外でのみ use ut...
-
UTF-8のPerlから、UTF-8、EUC、...
おすすめ情報