读取utf-8等编码的文本
2007-11-01 10:14
281 查看
int MultiByteToWideChar(
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr,// string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
CodePage, :所输入的多字节文本编码
dwFlags, :一般情况为0 即MB_PRECOMPOSED
当cbMultiByte为-1,lpWideCharStr为NULL,cchWideChar 为0时,可以计算出转换后宽字符串所需要的最小长度(即其返回值)
CFile newFOXFile;
CString newFOXStrLog;//保存结果
try{
char strBuffle[256];//读去文本缓存
memset(strBuffle,0,sizeof(strBuffle));//清空设为0
newFOXFile.Open(m_NewFOXPath.GetString(),CFile::modeRead);//打开文本文件
while(newFOXFile.Read(strBuffle,sizeof(strBuffle)-1))//注意确保缓存最后有以个是0,
{
wchar_t *wstrBuffle;
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_UTF8, 0,strBuffle, -1, NULL, 0);//获取转换UTF8多字节成宽直接所需的空间
if(255<dwMinSize)//检查是否越界
{
memset(wstrBuffle,0,sizeof(strBuffle));
continue;
}
wstrBuffle=new wchar_t[dwMinSize];
MultiByteToWideChar(CP_UTF8, 0,strBuffle, -1,wstrBuffle, dwMinSize);//转换
newFOXStrLog+=CString(wstrBuffle);//累加入结果字符串
delete wstrBuffle;
memset(wstrBuffle,0,sizeof(strBuffle));
}
无论是MultiByteToWideChar还是WideCharToMultiByte 都可以确定转换后的字符串长度的,MultiByteToWideChar,当cchWideChar 为0的时候,返回的就是长度,对WideCharToMultiByte ,当cbMultiByte为0 的时候,返回的是转换后的长度,所以,一般在不能确定转换后的长度情况下,一般需要调用相应的函数两次.第一次是获取转换后的长度,第二次正式转换.
宽字符转为多字节字符的代码如下:
wchar_t wText[20] = {L"宽字符转换实例!OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
delete []psText;
MultiByteToWideChar()函数乱码的问题
准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.
不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".
系统定制时选择默认语言的位置于:
Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr,// string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
CodePage, :所输入的多字节文本编码
CP_ACP | ANSI code page |
CP_MACCP | Macintosh code page |
CP_OEMCP | OEM code page |
CP_SYMBOL | Windows 2000/XP: Symbol code page (42) |
CP_THREAD_ACP | Windows 2000/XP: The current thread's ANSI code page |
CP_UTF7 | Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-7 |
CP_UTF8 | Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-8. |
MB_PRECOMPOSED | Always use precomposed charactersthat is, characters in which a base character and a nonspacing character have a single character value. This is the default translation option. Cannot be used with MB_COMPOSITE. |
MB_COMPOSITE | Always use composite charactersthat is, characters in which a base character and a nonspacing character have different character values. Cannot be used with MB_PRECOMPOSED. |
MB_ERR_INVALID_CHARS | If the function encounters an invalid input character, it fails and GetLastError returns ERROR_NO_UNICODE_TRANSLATION. |
MB_USEGLYPHCHARS | Use glyph characters instead of control characters. |
CFile newFOXFile;
CString newFOXStrLog;//保存结果
try{
char strBuffle[256];//读去文本缓存
memset(strBuffle,0,sizeof(strBuffle));//清空设为0
newFOXFile.Open(m_NewFOXPath.GetString(),CFile::modeRead);//打开文本文件
while(newFOXFile.Read(strBuffle,sizeof(strBuffle)-1))//注意确保缓存最后有以个是0,
{
wchar_t *wstrBuffle;
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_UTF8, 0,strBuffle, -1, NULL, 0);//获取转换UTF8多字节成宽直接所需的空间
if(255<dwMinSize)//检查是否越界
{
memset(wstrBuffle,0,sizeof(strBuffle));
continue;
}
wstrBuffle=new wchar_t[dwMinSize];
MultiByteToWideChar(CP_UTF8, 0,strBuffle, -1,wstrBuffle, dwMinSize);//转换
newFOXStrLog+=CString(wstrBuffle);//累加入结果字符串
delete wstrBuffle;
memset(wstrBuffle,0,sizeof(strBuffle));
}
无论是MultiByteToWideChar还是WideCharToMultiByte 都可以确定转换后的字符串长度的,MultiByteToWideChar,当cchWideChar 为0的时候,返回的就是长度,对WideCharToMultiByte ,当cbMultiByte为0 的时候,返回的是转换后的长度,所以,一般在不能确定转换后的长度情况下,一般需要调用相应的函数两次.第一次是获取转换后的长度,第二次正式转换.
宽字符转为多字节字符的代码如下:
wchar_t wText[20] = {L"宽字符转换实例!OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
delete []psText;
MultiByteToWideChar()函数乱码的问题
准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.
不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".
系统定制时选择默认语言的位置于:
Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.
相关文章推荐
- 用ASP读取/写入UTF-8编码格式的文件
- J2ME读取UTF-8编码文件方法
- [经验总结]解决Perl读取utf-8编码文件的问题
- J2ME中读取Unicode和UTF-8编码文件
- BOM与读取UTF-8编码格式文件首行乱码问题
- xp下新建文本文档编码格式预订为UTF-8 -- 解决简繁系统txt乱码问题
- 读取编码为utf-16le的文件并打印
- Mac OS 使用iconv 将gb18030编码文本转换为utf-8格式文本
- Adodb.Stream读取和写入UTF-8编码的文件
- J2ME中读取Unicode和UTF-8编码文件
- java读取文本编码问题
- php将中文转换成相应匹配的正则表达式(要求原文本为utf-8编码)
- Python读取UTF-8编码文件并使用命令行执行时输出结果的问题
- php从数据库中读取编码utf-8的中文内容输出到浏览器显示问号的解决方案
- [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题
- J2ME中读取Unicode和UTF-8编码文件
- J2ME中读取Unicode和UTF-8编码文件
- 判断字符流是不是UTF-8编码格式(读取文本文件需要转码时使用)
- linux 批量转换文本编码为UTF-8
- Java 小例子:按指定的编码读取文本文件内容