两种UNICODE字符集和MBCS字符集之间的转换方法
来源:互联网 发布:淘宝买个钻石店铺 编辑:程序博客网 时间:2024/06/01 20:23
写之前声明一下, 此篇日志参考与《把脉VC++》。
两种方法如下:
1、利用Windows提供的转换函数WideCharToMultiByte()和MultiByteToWideChar()来完成,函数的原型如下:
int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar );望文生义,WideCharToMultiByte()用来将宽字符转换成MBCS,MultiByteToWideChar()用以将MBCS转换成宽字符。通常情况下,我们可能开始并不知道转换之后的字符串会占用多大的字节,这个时候我们可以将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte()和MultiByteToWideChar(),它们的返回值即为目标字符串的字节大小,然后再利用该大小作为参数cbMultiByte,再次调用函数即可。
提示:将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte(),即可获取到目标字符串的大小,类似于这样的预先"喽一眼"输出缓冲区大小的操作,其实在Windows API中还是很常见的。通常我们将某个参数或者结构参数的成员置为NULL或者0,调用相同的API函数,即可达到"喽一眼"的效果,然后根据获取到的大小值来分配合适的内存。
2、用_bstr_t类来实现字符编码的转换。这种方法相当的管用,_bstr_t提供如下构造函数:
class _bstr_t {public:// Constructors//_bstr_t() throw();_bstr_t(const _bstr_t& s) throw();_bstr_t(const char* s) throw(_com_error);_bstr_t(const wchar_t* s) throw(_com_error);_bstr_t(const _variant_t& var) throw(_com_error);_bstr_t(BSTR bstr, bool fCopy) throw(_com_error); ...可以看出,_bstr_t同时支持char *和wchar_t *类型。_bstr_t提供了如下转换操作符函数:
// Assignment operators//_bstr_t& operator=(const _bstr_t& s) throw();_bstr_t& operator=(const char* s) throw(_com_error);_bstr_t& operator=(const wchar_t* s) throw(_com_error);_bstr_t& operator=(const _variant_t& var) throw(_com_error);下面我们就动手做一做吧:
#include <iostream>#include <windows.h>#include <comdef.h>using namespace std; int main() { setlocale(LC_ALL, "chs"); //配置地域化信息 char s1[] = "AB汉字"; wchar_t s2[] = {0x41,0x42,0x6c49,0x0}; //"AB汉"或者是这样赋值:L"AB汉"; //1、使用xtoy转换 //s2-->p1 //第一次调用,计算MBCS字符串字节长度 int len1 = WideCharToMultiByte( CP_ACP, 0, s2, //宽字符串指针 sizeof(s2), //宽字符串长度 NULL, 0, //参数0表示计算转换后的字符空间 NULL, NULL); char * p1 = new char[len1]; WideCharToMultiByte( CP_ACP, 0, s2, //宽字符串指针 sizeof(s2), //宽字符串长度 p1, //转换后的字符串指针 len1, //给出空间大小 NULL, NULL); printf("%s\r\n", p1); delete [] p1; //s1-->p2 //第一次调用,计算宽字符串字节长度 int len2 = MultiByteToWideChar( CP_ACP, 0, s1, //MBCS字符串指针 sizeof(s1), //MBCS字符串长度 NULL, 0); wchar_t * p2 = new wchar_t[len2]; MultiByteToWideChar( CP_ACP, 0, s1, //MBCS字符串指针 sizeof(s1), //MBCS字符串长度 p2, //转换后的字符串指针 len2); printf("%S\r\n", p2); delete [] p2; //2、使用BSTR完成转换 _bstr_t bs1(s1); _bstr_t bs2(s2); char * bp1 = bs2; //convert printf("%s\r\n", bp1); wchar_t * bp2 = bs1; //convert printf("%S\r\n",bp2);//大写S return 0; }输出结果如图所示:
- 两种UNICODE字符集和MBCS字符集之间的转换方法
- Unicode字符集与MBCS字符集转换
- MBCS与UNICODE字符集相互转换.
- ANSI、MBCS、UNICODE字符集
- ANSI、MBCS、UNICODE字符集
- unicode和MBCS(多字节字符集)的关系
- unicode和MBCS(多字节字符集)的关系
- unicode和MBCS(多字节字符集)的关系
- unicode和MBCS(多字节字符集)的关系
- C++ 中的字符集 Unicode 和 MBCS
- Unicode 和多字节字符集 (MBCS) 支持
- Unicode和多字节字符集 (MBCS) 杂谈
- Unicode和多字节字符集 (MBCS)
- Unicode和多字节字符集 (MBCS) 杂谈
- Unicode和多字节字符集 (MBCS) 杂谈
- Unicode 和多字节字符集 (MBCS) 支持
- [字符集]Unicode和UTF-8之间的转换详解
- [字符集]Unicode和UTF-8之间的转换详解
- NLTK与DataWiki
- javaSwing 圣诞节倒计时
- 无需充电的号角式iPhone扬声器Megaphone
- 工厂方法模式——Factory Method
- C#获取时间
- 两种UNICODE字符集和MBCS字符集之间的转换方法
- LLVM Language Reference Manual
- SQLServer2008设置 开启远程连接
- Eclipse快捷键大全
- 表单提交方法--图片
- c#与matlab数据交互
- Bitmap用法和Matrix总结
- java实现二叉查找树
- VIM 设置C++文本环境以及调式和编译