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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 文字化け。メモ帳でUTF-8に変換後、エクセルへ貼り付けたいです。 3 2022/08/14 07:21
- Windows 8 メモ帳による文字コード変換 2 2022/09/01 18:38
- HTML・CSS <meta charset="utf-8"><!-- 文字化け防止ユニコード --> ?最近モバイル 1 2022/12/11 04:27
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- その他(ソフトウェア) powershell で出力したテキストファイルをvim で開くと文字化け 2 2023/01/11 21:39
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
エディットボックスのフォントを変えたい
C言語・C++・C#
-
Win32APIでのエディットボックスの文字化け
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
-
4
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
5
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
6
CString から LPCTSTRの型に変換
C言語・C++・C#
-
7
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
8
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
9
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
10
リストビューの選択状態を取得するメッセージはありますか?
C言語・C++・C#
-
11
CStringをwchar_tに変換したい
C言語・C++・C#
-
12
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
13
UTF8→ShiftJISに変換したいです!
C言語・C++・C#
-
14
VC++ スタティックテクスト(Static Text)をダイアログ生成時に動的に変更したい
C言語・C++・C#
-
15
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
16
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
17
unicode文字列(日本語)のファイル出力方法
C言語・C++・C#
-
18
Visual C++によるcsvファイルの読み込みについて
C言語・C++・C#
-
19
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
20
VC++でエクセルのような表
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl でエラー:Wide character...
-
MFCのコントロールにUTF-8の文...
-
オブジェクト? perlをオーバー...
-
UTF-16からUTF-8への変換
-
数字を1桁なら半角、2桁以上...
-
sedやperlでの2バイト文字を含...
-
カタカナ一覧表が知りたい
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
マクロを使ってフォルダー内に...
-
Excel VBAでPDFファイルをMicro...
-
VBA 文字に半角が含まれて...
-
word差し込み印刷 半角カタカ...
-
エクセルで数値を全角文字(カ...
-
vba アクティブシートの名前変...
-
「何とかで始まり、何とかで終...
-
正規表現で、特定の文字列を含...
-
VBで、String型のデータが、...
-
VBA EXCEL あるセルの中の一...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl でエラー:Wide character...
-
【文字コード】外見上は全く同...
-
perlについての質問
-
sedやperlでの2バイト文字を含...
-
jcode.plのかわり
-
【LaTeX】pBibTeXでのエラーの...
-
MFCのコントロールにUTF-8の文...
-
カタカナ一覧表が知りたい
-
HTML::Templateでutf-8のテンプ...
-
CGIでメール送信で件名文字化け
-
Java+MySQLで特殊文字(丸数字(...
-
UTF-16からUTF-8への変換
-
printfの書式指定での2バイト文...
-
perlで読み込むテキストの文字...
-
デバッグ情報が文字化けする
-
UTF-8のPerlから、UTF-8、EUC、...
-
PerlでRSS取得 ~ 文字化け ~ ...
-
EC-CUBEでの文字化け
-
オブジェクト? perlをオーバー...
-
Perlで、文字の出現回数を調べ...
おすすめ情報