ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数

Posted 沙的空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数相关的知识,希望对你有一定的参考价值。

资料来自: 

http://blog.csdn.net/holamirai/article/details/47948745

http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489021.html

----------------------------------------------------------------------------------------------------------------

使用MultiByteToWideChar() 和 WideCharToMultiByte() 函数进行ANSI和UNICODE转换时,微软推荐通过执行同一函数两次,以确保转换成功,第一次执行获取保存转换结果所需内存大小,根据其返回值申请一片内存,第二次才真正执行转换。

MultiByteToWideChar() 返回值是确保转换成功的宽字符数,因此申请空间时需要乘以sizeof(wchar_t)。

WideCharToMultiByte() 返回值直接是确保转换成功所需的字节数,无需执行乘以sizeof操作;

具体实现可见示例代码。

 

宽字符到多字节字符转换函数

int WideCharToMultiByte( 
UINT CodePage, 
DWORD dwFlags, 
LPCWSTR lpWideCharStr, 
int cchWideChar, 
LPSTR lpMultiByteStr, 
int cbMultiByte, 
LPCSTR lpDefaultChar, 
LPBOOL lpUsedDefaultChar 
);

 

CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。 
CP_ACP 当前系统ANSI代码页 
CP_MACCP 当前系统Macintosh代码页 
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码 
CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么 
CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么 
CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 
CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 

 

注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区,详见下面的代码。另外,从Unicode UTF16向非Unicode字符集转换可能会导致数据丢失,因为该字符集可能无法找到表示特定Unicode数据的字符。

 

多字节字符到宽字符转换函数

int MultiByteToWideChar( 
UINT CodePage, 
DWORD dwFlags, 
LPCSTR lpMultiByteStr, 
int cbMultiByte, 
LPWSTR lpWideCharStr, 
int cchWideChar 
); 
dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。 
MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用 
MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式 
MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符 
MB_USEGLYPHCHARS 使用像形字符代替控制字符 

 

 

示例代码

#include "iostream"
#include "windows.h"
using namespace std;

void main()
{
    // UINCONDE  to  ANSI
    wchar_t* pwszUnicode = L"Holle, word! 你好,中国! "; 
    int iSize; 
    char* pszMultiByte; 
    iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); 
    pszMultiByte = (char*)malloc((iSize)/**sizeof(char)*/); 
    WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
    cout<<"UINCONDE to ANSI:"<<pszMultiByte<<endl;


    // ANSI to UNICODE
    locale loc( "chs" ); // 定义“区域设置”为中文方式
    wcout.imbue( loc ); // 载入中文字符输入方式
    char *pByteStr = "hello world! 你好,中国! "; 
    int iSize1;
    wchar_t *pWideStr ;
    iSize1 = MultiByteToWideChar(CP_ACP,0,pByteStr,-1,NULL,0);
    pWideStr = (wchar_t*)malloc(iSize1*sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP,0,pByteStr,-1,pWideStr,iSize1*sizeof(wchar_t));
    wcout<<"ANSI to UNICODE:"<<pWideStr<<endl;
    system("pause");

}

 

以上是关于ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数的主要内容,如果未能解决你的问题,请参考以下文章

unicode16与unicode32之间是啥转换关系

转: utf16编码格式(unicode与utf16联系)

unicode字符编码转换

该文件含有unicode格式的字符,当文件保存为ANSI编码的文本文件时,该字符将丢失.

Python 编码转换与中文处理

怎样将unicode编码转换为中文