こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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言語

投稿日時 - 2018-07-05 21:44:18

QNo.9515524

困ってます

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

>私はデータの先頭に0xEF,0xBB,0xBFを書き込むだけでUTF-8になり,BOMがなければUTF-8Nになると思っていたのですが、それでだめなら具体的にはどうすればいいのでしょうか?

Win32APIのCreateFile,WriteFileには文字コード変換の機能はなく書き込みしようとするバイト列がそのまま書き出されるだけです。
ですので、やるなら自分でUTF-8のバイト列に変換してください。

>私のやり方では、エディットボックスに「テスト」という文字列があった場合に保存したファイルの16進ダンプは、EF BB BF C6 30 B9 30 C8 30 となっています。

「テスト」をunicodeのコードで書くと U+30C6 U+30B9 U+30C8 です。
何か気づきませんか?

投稿日時 - 2018-07-06 21:38:04

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

それは本当にUTF-8で保存してあるのでしょうか?
擬態的にどのようなコードでやろうとしているのかわかりませんが、ファイルの先頭に0xEF,0xBB,0xBFを書けば後は勝手にUTF-8で保存してくれるわけではないですよ?

ファイルに保存しようとした文字列と、そのファイルの16進ダンプを書かれた方いいかもしれません。

投稿日時 - 2018-07-05 22:57:56

補足

回答ありがとうございます。
私はデータの先頭に0xEF,0xBB,0xBFを書き込むだけでUTF-8になり,BOMがなければUTF-8Nになると思っていたのですが、それでだめなら具体的にはどうすればいいのでしょうか?
私のやり方では、エディットボックスに「テスト」という文字列があった場合に保存したファイルの16進ダンプは、EF BB BF C6 30 B9 30 C8 30 となっています。
ファイルを保存している部分は次のようにしています。
TCHAR szfile[MAX_PATH]; //グローバル変数
void mysavefile(HWND hwnd,HWND hedit){
HANDLE hfile;
HGLOBAL hmem;
LPTSTR moji;
int editsize;
DWORD accbyte;
BYTE BOM[3]={0xEF,0xBB,0xBF};

OPENFILENAME ofn;
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.lpstrFile=szfile;
ofn.nMaxFile=MAX_PATH;
ofn.Flags=OFN_OVERWRITEPROMPT;
ofn.lpstrDefExt=TEXT("txt");

if(GetSaveFileName(&ofn)==0){
return;
}
hfile=CreateFile(szfile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
editsize=GetWindowTextLength(hedit);
hmem=GlobalAlloc(GHND,sizeof(TCHAR)*editsize+sizeof(TCHAR));
moji=(LPTSTR)GlobalLock(hmem);
GetWindowText(hedit,moji,editsize+1);
WriteFile(hfile,BOM,3,&accbyte,NULL);
WriteFile(hfile,moji,sizeof(TCHAR)*editsize,&accbyte,NULL);
GlobalUnlock(hmem);
GlobalFree(hmem);
CloseHandle(hfile);
}

投稿日時 - 2018-07-06 20:03:27

あなたにオススメの質問