c++ 多字节 转换为 unicode

来源:互联网 发布:apache服务器安装包 编辑:程序博客网 时间:2024/05/18 01:53


Unicode的出现是为了适应软件国际化的需要。Unicode不同于双字节字符集(DBCS)。


一、相关操作函数


       1、DBCS使用下面的函数操作字符串:


             CharNext——获得后一个字符


            CharPrev——获得前一个字符


            IsDBCSLeadByte——判断是否为两个字节字符的第一个字节


            C++运行期库提供了以"_mbs"开头的一系列的函数操作DBCS。类似的函数有_mbscat等。


       2、ANSI字符集是一个美国标准。C++运行期库提供了以"str"开头的一些列的函数操作此字符集。


       3、C++运行期库为Unicode字符集提供了一系列以"wcs"开头的函数。


二、对应的数据类型


       1、对于ANSI字符定义为char     多字符


        2、对于Unicode的字符定义为wchar_t     宽字符


三、使用环境


       1、首先要说明的是Win98对于Unicode的支持是很微弱的,所以如果要在Win98上运行Unicode编译的程序,可能造成运行错误或者失败。


       2、 由于Win2000及以后的OS的内核都是使用Unicode编写的,所以虽然可以在其上运行ANSI编码的程序,但是其运行过程中很多地方都需要将 ANSI转换为Unicode以后,调用Unicode版本的函数,因为这个转换的过程存在所以ANSI的程序运行效率不高。在Win2000上最好使用 Unicode编写程序。


四、编写通用的程序


       1、在编程的时候使用TCHAR数据类型,此类型能够根据预编译宏的定义,将其转换为ANSI或者是Unicode。


       2、预编译宏_MBCS、_UNICODE和UNICODE。_MBCS是多字节和ANSI字符串的编译宏。此时TCHAR将转换为char。_UNICODE和UNICODE是Unicode编码的预编译宏,TCHAR将转换为wchar_t。


       3、_UNICODE和UNICODE与_MBCS不能在编译的时候同时被定义。


       4、_UNICODE宏用于C运行期库的头文件,UNICODE宏用于Windows头文件。一般同时定义这两个宏。


五、转换函数


       1、Unicode转换为ANSI使用:MultiByteToWideChar。

函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。

函数原型:

int MultiByteToWideChar(

UINT CodePage,

DWORD dwFlags,

LPCSTR lpMultiByteStr,

int cchMultiByte,

LPWSTR lpWideCharStr,

int cchWideChar

);

CodePage:指定执行转换的字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值。你也可以指定其为下面的任意一值:

CP_ACP:ANSI字符集;CP_MACCP:Macintosh代码页;CP_OEMCP:OEM代码页;

CP_SYMBOL:符号字符集(42);CP_THREAD_ACP:当前线程ANSI代码页;

CP_UTF7:使用UTF-7转换;CP_UTF8:使用UTF-8转换。

dwFlags:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。你可以指定下面是标记常量的组合,含义如下:

MB_PRECOMPOSED:通常使用预作字符--就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与

MB_COMPOSITE值一起使用。

MB_COMPOSITE:通常使用组合字符--就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。不能与MB_PRECOMPOSED值一起使用。

MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。

MB_USEGLYPHCHARS:使用象形文字替代控制字符。

组合字符由一个基础字符和一个非空字符构成,每一个都有不同的字符值。每个预作字符都有单一的字符值给基础/非空字符的组成。在字符è中,e就是基础字符,而重音符标记就是非空字符。

函数的缺省动作是转换成预作的形式。如果预作的形式不存在,函数将尝试转换成组合形式。

标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。

lpMultiByteStr:指向将被转换字符串的字符。

cchMultiByte:指定由参数lpMultiByteStr指向的字符串中字节的个数。如果lpMultiByteStr指定的字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。

lpWideCharStr:指向接收被转换字符串的缓冲区。

cchWideChar:指定由参数lpWideCharStr指向的缓冲区的宽字符个数。若此值为零,函数返回缓冲区所必需的宽字符数,在这种情况下,lpWideCharStr中的缓冲区不被使用。





       2、ANSI转换为Unicode使用:WideCharToMultiByte。

WideCharToMultiByte( 0// specify the code page used to perform the conversion

0,         // no special flags to handle unmapped characters

pwstr,     
// wide character string to convert

nlength,   
// the number of wide characters in that string

NULL,      
// no output buffer given, we just want to know how long it needs to be

0,

NULL,      
// no replacement character given

NULL );    
// we don't want to know if a character didn't make it through the translation



宽字符转多字符:


       size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );


多字符转宽字符:


       size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count );




下面是字符转换代码:

1.  wchar_t   转换为 char

char* WcharToChar(const wchar_t* wp){char *m_char;int len = WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);m_char = new char[len + 1];WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), m_char, len, NULL, NULL);m_char[len] = '\0';return m_char;}

2.char 转换为 whar_t

//将char* 转成wchar_t*的实现函数如下://这是把asii字符转换为unicode字符,和上面相同的原理void c2w(wchar_t *pwstr,size_t len,const char *str){if(str)    {      size_t nu = strlen(str);      size_t n =(size_t)multibytetowidechar(cp_acp,0,(const char *)str,(int)nu,null,0);      if(n>=len)n=len-1;      multibytetowidechar(cp_acp,0,(const char *)str,(int)nu,pwstr,(int)n);   pwstr[n]=0;    }}












原创粉丝点击