VC 2005におけるfopenのccs=UNICOD実測<br>+UTF 8からansiへの移行方法
3445 ワード
msdnの記述によれば、パラメータがccs=UNICodeであれば(注:ここでのUNICodeはUTF-8やUTF-16 LEなどの総称を指す)ファイルにBOMヘッダがなければANSIと符号化され、css=UTF-8であればUTF-8と符号化され、css=UTF-8であればファイルBOMがUTF-16 LEであればUTF-16 LEと符号化され、css=UTF-16 LEWindowsが持参したNotepad(メモ帳)プログラムが書かれていることに相当する保存できる符号化フォーマットはANSI Unicode(注:ここでのUnicodeは総称ではなく、特にUnicode little endian、すなわち第1セグメントのUTF-16 LE)Unicode big endian(注:この符号化は第1セグメントに対応するccsがない)UTF-8が実際のテストコードに従って使用されなければならない_wfopen/fgetws、fopenを使用するとfgets時報が間違ってファイルがANSIにエンコードされている場合はsetlocale(LC_CTYPE、「Chinese-simplified」)を使用する必要があり、UNICDE(UTF-8、UTF-16 LE)である場合は必要ありません.(注:locale問題は本稿とは関係ありませんが、コードを書くときにうっかり漏れないようにちなみに)まとめ:1.ファイルがUNICode(UTF-8、UTF-16 LE)にエンコードされている場合、ccs=UNICodeを使用しないとフォーマットが正しくありません.(もちろん、バイナリ方式で「rb」を開き、自分で変換することができる).ファイルがUNICode(UTF-8、UTF-16 LE)として符号化されているが、BOMヘッダがない場合は、css=UTF-8、css=UTF-16 LEで符号化を示す必要があり、ccs=UNICodeを直接使用してはならない.そうしないとANSI符号化とみなされる. 3. メモ帳にUnicode big endianという符号化形式が保存すると、ccs=UNICODという機能は使用できない.ccs=UNICコードを使用する場合は、ファイル自体がANSI形式で符号化されていても、ワイド文字形式の対応する関数を使用する必要があります.
UTF 8がANSIに移行する方法
UTF 8がANSIに移行する方法
CString Csee2saymiaoDlg::Utf8toANSI(CString
&
strUTF)
{
int
FontNameLen
=
1024
;
char
*
FontNameBuffer
=
new
char
[FontNameLen];
WCHAR
*
NewFontName
=
new
WCHAR[FontNameLen];
CString FontName;
strcpy(FontNameBuffer, strUTF.GetBuffer());
MultiByteToWideChar(CP_UTF8,
0
,FontNameBuffer,FontNameLen,NewFontName,FontNameLen);
//
UTF8 WCHAR
WideCharToMultiByte(CP_ACP,
0
,NewFontName,FontNameLen,FontName.GetBuffer(FontNameLen),FontNameLen,NULL,NULL);
FontName.ReleaseBuffer(FontNameLen);
return
FontName;
}