//========================================================================
//TITLE:
// MultiByteToWideChar和WideCharToMultiByte用法详解
//AUTHOR:
// norains
//DATE:
// 第一版:Monday 25-December -2006
// 增补版:Wednesday 27-December -2006
// 修订版:Wednesday 14-March-2007 (修正之前的错误例子)
// 再次修订版:Tuesday 18-September-2007 (修正代码的参数错误)
//Environment:
// EVC4.0 + Standard SDK
//========================================================================
1.使用方法详解
在本文开始之处,先简要地说一下何为短字符和宽字符.
所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.
宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.
好吧,那就让我们开始吧.
这个是我们需要转化的多字节字符串:
char sText[20] = {"多字节字符串!OK!"};
我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.
所幸,我们能够确知所需要的数组空间.
我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
接下来,我们只需要分配响应的数组空间:
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText)
{
delete []pwText;
}
接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);
最后,使用完毕当然要记得释放占用的内存:
delete []pwText;
同理,宽字符转为多字节字符的代码如下:
wchar_t wText[20] = {L"宽字符转换实例!OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);
delete []psText;
如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:
//-------------------------------------------------------------------------------------
//Description:
// This function maps a character string to a wide-character (Unicode) string
//
//Parameters:
// lpcszStr: [in] Pointer to the character string to be converted
// lpwszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
//---------------------------------------------------------------------------------------
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
{
// Get the required size of the buffer that receives the Unicode
// string.
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
if(dwSize < dwMinSize)
{
return FALSE;
}
// Convert headers from ASCII to Unicode.
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
return TRUE;
}
//-------------------------------------------------------------------------------------
//Description:
// This function maps a wide-character string to a new character string
//
//Parameters:
// lpcwszStr: [in] Pointer to the character string to be converted
// lpszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
//---------------------------------------------------------------------------------------
BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
{
DWORD dwMinSize;
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
if(dwSize < dwMinSize)
{
return FALSE;
}
WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
return TRUE;
}
使用方法也很简单,示例如下:
wchar_t wText[10] = {L"函数示例"};
char sText[20]= {0};
WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));
这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.
2.MultiByteToWideChar()函数乱码的问题
有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.
不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".
系统定制时选择默认语言的位置于:
Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/norains/archive/2006/12/25/1461174.aspx
分享到:
相关推荐
《MultiByteToWideChar和WideCharToMultiByte函数详解》 在Windows开发中,处理不同编码格式的字符串转换是一项常见的任务。MultiByteToWideChar和WideCharToMultiByte是Windows API提供的两个关键函数,用于在多...
【MultiByteToWideChar函数详解】 MultiByteToWideChar是一个Windows API函数,它的主要作用是将一个多字节字符串转换为宽字符(Unicode)字符串。在处理不同编码的字符串时,这个函数非常有用,特别是在需要在多...
其中,使用 MultiByteToWideChar 函数和 WideCharToMultiByte 函数是最常用的方法。MultiByteToWideChar 函数可以将普通字符转换为宽字符,而 WideCharToMultiByte 函数可以将宽字符转换为普通字符。 在将普通字符...
例如,可以调用Windows API中的"MultiByteToWideChar"和"WideCharToMultiByte"函数进行字符集的转换。同时,也可以通过编写自定义函数,利用字典映射的方式,将简体字符映射到对应的繁体字符。这种方式虽然效率较低...
- 使用`MultiByteToWideChar`函数将多字节字符串转换为宽字符字符串(WCHAR数组)。 - 再通过`WideCharToMultiByte`函数将宽字符字符串转换为UTF-8编码的字符序列。 2. **UTF8ToMB** 该函数实现了从UTF-8编码...
在VB6(Visual Basic 6)编程环境中,开发者可以利用内置的内码转换功能来实现中文繁简体的转换。这种转换是通过处理字符编码来完成的,涉及到字符...在实际开发中,理解字符编码原理和API的正确使用方法是至关重要的。
2. **Windows API函数**:`WideCharToMultiByte`和`MultiByteToWideChar`函数是Windows平台下进行字符编码转换的主要手段。 3. **内存管理**:在转换过程中,需要注意动态分配和释放内存资源,避免内存泄漏。 #### ...
具体来说,我们可以使用`MultiByteToWideChar`和`WideCharToMultiByte`这两个函数来进行转换。 ##### 2.1 GBK转UTF-8 ```cpp stringGBKToUTF8(const std::string& strGBK) { string strOutUTF8 = ""; WCHAR* str...
以下代码展示了如何使用 `WideCharToMultiByte` 和 `MultiByteToWideChar` 函数进行字符串转换: ```cpp #include #include #include using namespace std; int main(int argc, _TCHAR* argv[]) { unsigned ...
这些函数使用了Windows API中的`MultiByteToWideChar()`和`WideCharToMultiByte()`函数来完成转换。例如,`ANSIToUnicode()`函数中: ```c int textlen; wchar_t* result; textlen = MultiByteToWideChar(CP_ACP, 0...
1. 使用 `MultiByteToWideChar` 函数,该函数可以将 Ansi 字符串转换为 Unicode 字符串。 2. 使用 `setlocale` 函数设置当前地域信息,并使用 `swprintf` 函数将 Ansi 字符串转换为 Unicode 字符串。 Unicode 转 ...
### Unicode、ASCII、UTF-8 相互转换详解 #### 一、引言 在计算机科学领域,字符编码是将人类可读的文本转换为计算机能够处理的形式的关键技术。Unicode、ASCII 和 UTF-8 是三种非常重要的字符编码标准。本文将详细...
在需要进行编码转换时,可以利用 Windows 提供的 `MultiByteToWideChar` 和 `WideCharToMultiByte` 函数来实现 Unicode 和 ANSI 之间的转换。这些函数非常强大且灵活,支持多种转换选项,如指定转换错误处理方式、...
在Windows平台上,可以利用Win32 API提供的函数实现字符编码转换,如`WideCharToMultiByte`和`MultiByteToWideChar`。这两个函数可以帮助我们将GB2312编码转换为UTF-8编码。具体实现示例如下: ```cpp const char* ...
3. **文件内容转换**:建议使用 `MultiByteToWideChar` 和 `WideCharToMultiByte` 函数。 #### `CString`与`std::string`的转换 - `CString`到`std::string`: ```cpp CString strMfc = "test"; std::string ...
这一过程可以使用Windows API函数`WideCharToMultiByte`来实现,其中参数`CodePage`设置为GB2312对应的代码页值936。 **从GB2312转换到UTF-8:** 相反的过程,即从GB2312编码的文本转换到UTF-8,也需要先将GB2312...
总结来说,CString是MFC框架中处理字符串的强大工具,它支持多种字符串转换和操作,同时也需要了解其他常见的字符串类型如BSTR、char*、wstring等,以及它们之间的转换方法。掌握这些转换和操作有助于提高编程效率,...
- **性能优势**:相比使用封装好的类库和控件,直接调用API可以减少额外的封装开销,提高执行效率。 - **灵活性**:能够处理更为复杂和特殊的应用场景。 #### 五、学习Win32 API的重要性 - **深入了解Windows内部...
- **示例**: 使用`MultiByteToWideChar`和`WideCharToMultiByte`函数转换编码。 #### 十三、改变颜色(整个窗体的控件) - **知识点**: 改变控件颜色涉及到设置控件的背景色和前景色。 - **示例**: 使用`...