Unicode与char类型串的转换

一。Unicode字符串转换char类型串一般有以下几种方法

1.调用 WideCharToMultiByte() API;

    int WideCharToMultiByte (
    UINT    CodePage,
    DWORD   dwFlags,
    LPCWSTR lpWideCharStr,
    int     cchWideChar,
    LPSTR   lpMultiByteStr,
    int     cbMultiByte,
    LPCSTR  lpDefaultChar,
    LPBOOL  lpUsedDefaultChar );
    以下是参数解释:

  • CodePage:Unicode字符转换成的代码页。你可以传递CP_ACP来使用当前的ANSI代码页。代码页是256个字符集。字符0——127与ANSI编码一样。字符128——255与ANSI字符不同,它可以包含图形字符或者读音符号。每一种语言或地区都有其自己的代码页,所以使用正确的代码页对于正确地显示重音字符很重要。
  • dwFlags:dwFlags 确定Windows如何处理“复合” Unicode字符,它是一种后面带读音符号的字符。
    如è就是一个复合字符。如果这些字符在CodePage参数指定的代码页中,不会出什么事。
    否则,Windows必须对之进行转换。传递WC_COMPOSITECHECK使得这个API检查非映射复合字符。
    传递WC_SEPCHARS使得Windows将字符分为两段,即字符加读音,如e`。
    传递WC_DISCARDNS使得Windows丢弃读音符号。
    传递WC_DEFAULTCHAR使得Windows用lpDefaultChar参数中说明的缺省字符替代复合字符。
    缺省行为是WC_SEPCHARS。
  • lpWideCharStr 要转换的Unicode串。
  • cchWideChar lpWideCharStr在Unicode 字符中的长度。通常传递-1,表示这个串是以0x00结尾。
  • lpMultiByteStr 接受转换的串的字符缓冲 cbMultiByte lpMultiByteStr的字节大小。
  • lpDefaultChar 可选——当dwFlags包含WC_COMPOSITECHECK | WC_DEFAULTCHAR并且某个Unicode字符不能被映射到同等的ANSI串时所传递的一个单字符ANSI串,包含被插入的“缺省”字符。可以传递NULL,让API使用系统缺省字符(一种写法是一个问号)。
  • lpUsedDefaultChar 可选——指向BOOL类型的一个指针,设置它来表示是否缺省字符曾被插入ANSI串。可以传递NULL来忽略这个参数。

        // 假设已经有了一个Unicode 串 wszSomeString...
     char szANSIString [MAX_PATH];

    WideCharToMultiByte ( CP_ACP,                // ANSI 代码页
                          WC_COMPOSITECHECK, // 检查重音字符
                          wszSomeString,         // 原Unicode 串
                          -1,                    // -1 意思是串以0x00结尾
                          szANSIString,          // 目的char字符串
                          sizeof(szANSIString),  // 缓冲大小
                          NULL,                  // 系统缺省字符串
                          NULL );                // 忽略这个参数

调用这个函数后,szANSIString将包含Unicode串的ANSI版本。

2.调用CRT 函数wcstombs();

size_t wcstombs (
    char*          mbstr,
    const wchar_t* wcstr,
    size_t         count );
以下是参数解释:

mbstr:接受结果ANSI串的字符(char)缓冲。
wcstr:要转换的Unicode串。
count:mbstr参数所指的缓冲大小。

wcstombs()在它对WideCharToMultiByte()的调用中使用WC_COMPOSITECHECK | WC_SEPCHARS标志。用wcstombs()转换前面例子中的Unicode串,结果一样:

wcstombs ( szANSIString, wszSomeString, sizeof(szANSIString) );

3.使用CString 构造器或赋值操作(仅用于MFC );

 

MFC中的CString包含有构造函数和接受Unicode串的赋值操作,所以你可以用CString来实现转换。例如:

// 假设有一个Unicode串wszSomeString...CString str1 ( wszSomeString ); // 用构造器转换CString str2;str2 = wszSomeString; // 用赋值操作转换
str1.GetBuffer()返回char类型字符串

4.使用ATL 串转换宏;

ATL有一组很方便的宏用于串的转换。W2A()用于将Unicode串转换为ANSI串(记忆方法是“wide to ANSI”——宽字符到ANSI)。实际上使用OLE2A()更精确,“OLE”表示的意思是COM串或者OLE串。下面是使用这些宏的例子:

#include <atlconv.h>// 还是假设有一个Unicode串wszSomeString...{	char szANSIString [MAX_PATH];	USES_CONVERSION; // 声明这个宏要使用的局部变量	lstrcpy ( szANSIString, OLE2A(wszSomeString) );}

  OLE2A()宏“返回”转换的串的指针,但转换的串被存储在某个临时栈变量中,所以要用lstrcpy()来获得自己的拷贝。其它的几个宏是W2T()(Unicode 到 TCHAR)以及W2CT()(Unicode到常量TCHAR串)。
  有个宏是OLE2CA()(Unicode到常量char串),可以被用到上面的例子中,OLE2CA()实际上是个更正宏,因为lstrcpy()的第二个参数是一个常量char*,关于这个问题本文将在以后作详细讨论。
  另一方面,如果你不想做以上复杂的串处理,尽管让它还保持为Unicode串,如果编写的是控制台应用程序,输出/显示Unicode串时应该用全程变量std::wcout,如:

wcout << wszSomeString;

  但是要记住,std::wcout只认Unicode,所以你要是“正常”串的话,还得用std::cout输出/显示。对于Unicode串文字量,要使用前缀L标示,如:

wcout << L"The Oracle says..." << endl << wszOracleResponse;

如果保持串为Unicode,编程时有两个限制:

  • 必须使用wcsXXX() Unicode串处理函数,如wcslen();
  • 在Windows 9x环境中不能在Windows API中传递Unicode串。要想编写能在9x和NT上都能运行的应用,必须使用TCHAR类型,详情请参 考MSDN;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值