转自:http://blog.itpub.net/27634692/viewspace-752200/

有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,有必要把来龙去脉搞清楚。 为了搞清这些函数,就必须理请几种字符类型的写法。

先说一下wchar_t

wchar_t是Unicode字符的数据类型,它实际定义在里:

typedef unsigned short wchar_t;

不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:

wchar_t *szTest=L"This is a Unicode string."

下面再看看TCHAR:

如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。

以strcpy函数为例子,总结一下:

如果你想使用ANSI字符串,那么请使用这一套写法:

char szString[100];

strcpy(szString,"test");

如果你想使用Unicode字符串,那么请使用这一套:

wchar_t szString[100];

wcscpy(szString,L"test");

如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:

TCHAR szString[100];

_tcscpy(szString,_TEXT("test"));

ANSI与Unicode

Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。

将ANSI转换到Unicode

(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);

(2)通过MultiByteToWideChar函数实现转换,例如:

char *szProgID = "MAPI.Folder";

WCHAR szWideProgID[128];

CLSID clsid;

long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));

szWideProgID[lLen] = '

(3)通过A2W宏来实现,例如:

USES_CONVERSION;

CLSIDFromProgID(A2W(szProgID),&clsid);

将Unicode转换到ANSI

(1)使用WideCharToMultiByte,例如:

// 假设已经有了一个Unicode 串 wszSomeString...

char szANSIString [MAX_PATH];

WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );

(2)使用W2A宏来实现,例如:

USES_CONVERSION;

pTemp=W2A(wszSomeString);

unicode与wchar_t

unicode和wchar_t有什么必然联系没?答案是没有,没有任何联系。一个是字符编码,一个是字符类型。实际上,unicode不是一种编码标准,而是几种编码的统称。utf-8,utf16(ucs2),utf-32(ucs4)等。在windows系统下,如果没有特别说明,我们习惯上指unicode编码为utf-16,而linux上是utf-32。所以,在windows上面sizeof(wchar_t) 是2,而linux下面是4。

实际上windows下面wchar_t就是一个 unsigned short,而linux上是 unsigned int。而utf-8就是我们常说的多字节编码,这种编码下面,一个中文不一定只是两个字节,可能是三个的。然后,你的代码中的const char* 字符串是什么编码,和你编译器,和你代码文件编码也是没有半毛关系的,这个是和系统有关系的,也就是locale有关的。但你读写文件时候字符的编码是和文件有关的。而所谓的 ANSI 就是和系统相关的编码。你操作系统采用什么编码,它就是什么编码。

char与wchar_t数据类型的更多相关文章

  1. char 转wchar_t 及wchar_t转char

    利用WideCharToMultiByte函数来转换,该函数映射一个unicode字符串到一个多字节字符串.通常适合于window平台上使用. #include <tchar.h> #in ...

  2. char* 和 wchar_t* 如何互相转换

    char* 和 wchar_t* 如何互相转换 C函数可以用 wcstombs - 将宽字符转换成多字符 WCHAR ->  CHAR      mbstowcs - 把多字符把转换成宽字符 C ...

  3. 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换 [转]

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下. #ifndef USE_H_ #define USE_H_ # ...

  4. 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下-复制代码 代码如下:    #ifndef USE_H_     ...

  5. 自己写实现char TO wchar_t 的转换

    wchar_t CharToWChart(char nChar){    wchar_t nR;    nR=nChar+32*256;    return nR;}//--------------- ...

  6. char,wchar_t 长度

    (测试环境:VC++6.0) char类型 wchar_t类型 类型大小(32位系统) 8位 16位 常量字符表示法 'A' L'A' 或 'A' 常量字符串表示法 'hello' L'hello' ...

  7. linux 下 Linux 下char转换为wchar_t 设置本地为utf-8编码 以及wchar 的输入输出

    LInux下使用mbstowcs函数可以将char转化为wchar_t函数含义:convert a multibyte string to a wide char string说明:       Th ...

  8. C++中char*与wchar_t*之间的转换

    http://blog.163.com/tianshi_17th/blog/static/4856418920085209414977/ 关于C++中的char*与wchar_t*这两种类型的相互转换 ...

  9. [VC]char 和 wchar_t相互转化

    #include <windows.h> #include <stdio.h> //function: charTowchar //purpose:char to WCHAR ...

随机推荐

  1. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之游戏效果预览(一)

    今天看完了李刚老师的<疯狂Android讲义>一书中的第18章<疯狂连连看>,从而学会了如何编写一个简单的Android疯狂连连看游戏. 开发这个流行的小游戏,难度适中,而且能 ...

  2. SpringMVC的第一个入门案例

    用户提交一个请求,服务器端处理器在接收到这个请求后,给出一条欢迎信息,在页面中显示. 第一步:导入jar包 在原有Springjar包基础上添加2个jar包 spring-webmvc-4.2.0.R ...

  3. QT5使用Webkti

    Qt 5.3 使用原来的QT4.8.4项目时QWebView .QWebFrame等类无法编译通过. 出现原因:QWebView .QWebFrame.QWebPage.QWebInspector等这 ...

  4. 很详细、很移动的Linux makefile 教程

    近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...

  5. 根据UI找对应的j s 脚本

    1.页面内容的脚本 2.页面外部脚本 3.根据UI找j s 脚本

  6. 探测web服务器质量——pycurl

    pycurl是一个用C语言写的libcurl Python实现,功能非常强大,支持的操作协议有FTP.HTTP.HTTPS.TELNET等,可以理解为Linux下curl命令功能的Python封装,简 ...

  7. 高性能javascript学习总结(1)--加载与运行

    一.脚本的位置         我们知道,一个<script>标签可以放在 HTML 文档的<head>或<body>标签中,但是浏览器是怎么加载和执行这些java ...

  8. /dev/sda

    /dev/sda这是Linux系统下的设备文件,类似Windows系统上面的本地磁盘.U盘.光驱等设备.Linux系统访问设备文件需要mount命令挂载映射成文件,查看: 1.建一个目录(挂载磁盘分区 ...

  9. bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 476[Submit][Status][Dis ...

  10. Cocos2d-x中手动构造Json::Value

    由于项目需要Json::Value 不是由服务器传送过来,而是自己手动构造. 带数组的json Json::Value items; for(int i=0,i<2;i++) { items[i ...