CFile的Unicode宽字符写文件
ANSI字符集称为窄字符,8位,C语言用unsignedchar表示,不能存放世界上所有语言所有文字。
UNICODE字符集称为宽字符,16位,C语言用unsignedshort表示,可以存放世界上所有语言所有文字。
宽字符字符串表示为一个wchar_t[]数组并由wchar_t* 指针指向它。可以通过用字母L作为字符的前缀将任何ASCII字符表示为宽字符形式。例如,L'/0' 是终止宽(16位)NULL字符。同样,可以通过用字母L作为ASCII字符串的前缀L"Hello") 将任何ASCII字符串表示为宽字符字符串形式。
ANSI的文件的CFile读写代码一般如下:
CFileansifile;
CStringstr=_T(”Hello!”);
ansifile.Open(“文件名”,CFile::modeCreate|CFile::modeReadWrite);
ansifile.Write(str,str.Getlength());
ansifile.Close();
上面代码虽然使用宏_T()来申明了CString对象,但是在文件写入的时候,str.Getlength()的值任然位窄字符的长度;如果采用str.Getlength()*sizeof(wchar_t)的话,写入文件的将会出现乱码。因此CFile如果要写入宽字符的话,应该采用以下方式:
CFileunicodefile;
Wchar_tstr=L”Hello!”;
unicodefile.Open(“文件名”,CFile::modeCreate|CFile::modeReadWrite);
unicodefile.Write(str,wcslen(str)));
unicodefile.Close();
CString 和wchar_t*之间的转换:
1. CString 转 wchar_t*
CStringstr"Hell Kesuer";
wchar_twstr=path.AllocSysString();
或者:
wchar_twstr
MultiByteToWideChar(CP_ACP,0,str,-1,wcstring,256);
或者:
USES_CONVERSION;
wchar_t* wstr=A2W(str);
2. wchar_t*转CString
wchar_twcstring[256];
CStringstr
WideCharToMultiByte(CP_ACP,0,wcstring,256,str.GetBuffer(0),256,NULL,NULL);
str.ReleaseBuffer(0);
MultiByteToWideChar
函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。
函数原型:int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
WideCharToMultiByte
函数功能:该函数映射一个unicode字符串到一个多字节字符串。
函数原型:int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, LPCSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, PBOOL pfUsedDefaultChar );