- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UTF-8での保存について)
UTF-8での保存について
このQ&Aのポイント
- UTF-8での日本語文字列の保存がうまくいかない
- UTF-8の場合、先頭にBOMを追加して保存しても文字化けする
- バイナリエディタで開くと、先頭の3バイトはEFBBBFとなっている
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>私はデータの先頭に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 です。 何か気づきませんか?
その他の回答 (1)
- wormhole
- ベストアンサー率28% (1626/5665)
回答No.1
それは本当にUTF-8で保存してあるのでしょうか? 擬態的にどのようなコードでやろうとしているのかわかりませんが、ファイルの先頭に0xEF,0xBB,0xBFを書けば後は勝手にUTF-8で保存してくれるわけではないですよ? ファイルに保存しようとした文字列と、そのファイルの16進ダンプを書かれた方いいかもしれません。
補足
回答ありがとうございます。 私はデータの先頭に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); }