得到一个Unicode串时,可以用下列几种方法之一将它转换成char类型串

转载 2012年03月31日 08:25:46

    当你从某个COM方法返回得到一个Unicode串时,可以用下列几种方法之一将它转换成char类型串:

1、调用 WideCharToMultiByte() API。
2、调用CRT 函数wcstombs()。
3、使用CString 构造器或赋值操作(仅用于MFC )。
4、使用ATL 串转换宏。 

WideCharToMultiByte()
    你可以用WideCharToMultiByte()将一个Unicode串转换成一个ANSI串。此函数的原型如下:

int WideCharToMultiByte (

    UINT    CodePage,

    DWORD   dwFlags,

    LPCWSTRlpWideCharStr,

    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来忽略这个参数。
我自己都有点晕菜了……!,万事开头难啊……,不搞清楚这些东西就很难搞清楚COM的串处理。何况文档中列出的比实际应用的要复杂得多。下面就给出了如何使用这个API的例子:

// 假设已经有了一个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版本。

wcstombs()
    这个CRT函数wcstombs()是个简化版,但它终结了WideCharToMultiByte()的调用,所以最终结果是一样的。其原型如下:

size_t wcstombs (

    char*          mbstr,

    constwchar_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) );

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

// 假设有一个Unicode串wszSomeString...

CString str1 ( wszSomeString ); // 用构造器转换
CString str2;

str2 = wszSomeString; // 用赋值操作转换

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。

Unicode 串转换成Char类型串

仔细做好串处理     这一部分将花点时间来讨论如何在COM代码中处理串。如果你熟悉Unicode 和ANSI,并知道如何对它们进行转换的话,你就可以跳过这一部分,否则还是读一下这一部分的内容。 ...
  • ayw_hehe
  • ayw_hehe
  • 2011年10月24日 16:48
  • 586

实验9 问题 B: 编写函数:字符串的连接 之一 (Append Code)

题目描述 将输入的两个字符串连接在一起输出。 -----------------------------------------------------------------------...
  • ligenzhi131619
  • ligenzhi131619
  • 2016年12月05日 09:47
  • 901

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /* * ...
  • gzpsunshine
  • gzpsunshine
  • 2018年01月01日 17:36
  • 187

蓝桥杯:基础练习 十六进制转十进制

基础练习 十六进制转十进制   时间限制:1.0s   内存限制:512.0MB        问题描述   从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为...
  • catchingSun
  • catchingSun
  • 2016年01月24日 00:16
  • 2716

求最长公共子串(串)

题目描述 求采用顺序结构存储的串s和串t的一个最长公共子串,若没有则输出false,若最长的有多个则输出最先出现的那一串。 输入要求 输入两个字符串 输出要求 输出公共子串 假...
  • a120705230
  • a120705230
  • 2014年11月21日 17:07
  • 1260

java字符串处理方法全解

java字符串处理方法全解 String类: •String类主要用来处理字符串,它提供了很多字符串的实用处理方法。String类是不可变类,一个String对象所包含的字符串内容永远不会被改变;...
  • wangwilliams
  • wangwilliams
  • 2012年10月20日 16:12
  • 589

回文--nkoj3681

P3681  回文 时间限制 : - MS   空间限制 : 65536 KB 评测说明 : 时限1000ms 问题描述    给你一个由N个小写字母构成的字符串,请你将它改成“回文串”。你...
  • INCINCIBLE
  • INCINCIBLE
  • 2016年05月15日 16:30
  • 219

数据结构(C实现)------- 串

字符串(简称串),可以将其看作是种特殊的线性表,其特殊性在于线性表的数据元素的类型总是字符性,字符串的数据对象红豆为字符集。     串是由0个或多个字符组成的有限序列。一般记作:s = "s1 s2...
  • jesson20121020
  • jesson20121020
  • 2014年09月23日 00:59
  • 2847

算法篇-字符串-周期串

题目:如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。 ...
  • Liuchang54
  • Liuchang54
  • 2015年04月01日 08:30
  • 647

解决SharePoint 的Excel文件, 使用本地打开Excel 2013“无法访问文件。请尝试下列方法之一”

解决SharePoint 无法访问文件。请尝试下列方法之一(solve ) 这个问题困扰我近一周的时间,找个了,baidu,bing,google。 操作系统从win7 家庭版--换到企业版--换到旗...
  • jason_dct
  • jason_dct
  • 2016年03月02日 19:53
  • 4983
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:得到一个Unicode串时,可以用下列几种方法之一将它转换成char类型串
举报原因:
原因补充:

(最多只允许输入30个字)