宽字节和多字节,一度是我的噩梦,明明是调用同一个API,但是最后的返回值一会是char *,一会又是wchar_t *,实属烦人。

Windows中有两种编码格式:
(1) ANSI/多字节编码(基本是一个字符占一个字节,有些占两个字节);
(2) UNICODE/宽字节编码(说是每个字符占1~3个字符,基本上是每个字符占两个字节)。
(ANSI是早期的编码格式,各国不统一,所以多种文字一起使用时经常出现乱码,后来为了统一编码格式,就出现了UNICODE,所以现在项目里默认编码一般都推荐使用UNICODE)

正因为上述原因,所以windows的IDE中很多API都有两种重定义格式:
#ifdef UNICODE
#define XXX XXXW //若编码格式为UNICODE,则使用宽字节形式API,后缀加上W
#else
#define XXX XXXA //若编码格式为ANSI,则使用多字节形式API,后缀加上A
#endif

那么问题也来了:
ANSI使用的字符串是多字节,类型定义为const char */LPCSTR;
UNICODE使用的字符串是宽字节,类型定义为const wchar_t */LPCWSTR;
假如项目代码中用到了很多的字符串操作,后面万一我想从ANSI码切换到UNICODE码,那么我的字符串格式肯定也要变了,我要把每一个LPCSTR都改成LPCWSTR吗?
或者我从UNICODE切换到ANSI,是不是也要把所有的字符串改掉?

为了省事,windows平台IDE给了L(X)宏和T(X)宏(头文件:#include <tchar.h>),作用如下:
(1) L(X):把字符串X全部转成宽字节;(这么做有风险,假如字符集是ANSI,那么使用L全部转成宽字节还是会报错)
(2) _T(X):这个宏不会明确指出到底是用ANSI还是UNICODE,它是根据API实际使用的字符集去自动转化编码,假如需要使用的字符串是多字节,它会把X自动转成多字节,同理,假如需要使用的字符串是宽字节,它会把X自动转成宽字节,比较方便,推荐使用这个宏。

此外,还有一种字符串定义方式TCHAR:
(1) Unicode模式下:TCHAR就是wchar_t;
(2) ANSI模式下:TCHAR就是char。
所以,在windows平台IDE中,最稳如老狗的字符串定义为: TCHAR *str = _T(“hello”);

综上所述,我相信很多人刚写MFC都碰到过这么一个问题:MFC的CString字符串怎么转化成C语言/C++自带的const char *类型字符串?
网上很多代码都是类似于以下代码写的:

CString str = _T("Hello world!");
const char *msg = str.GetBuffer();

我把这代码直接复制粘贴下来,但是我相信很多人又碰到了跟我一样的问题:这个代码,有时可以编译通过,有时编译却又通不过(肯定不止我一个人碰到这个事吧),但凡是做过项目开发的都应该有这个意识,这代码肯定是有问题的。。。。其实就是字符集在捣鬼。因为CString类的GetBuffer()方法,返回的字符串类型就是会根据字符集自动转换成char *(ANSI码格式)和wchar_t *(UNICODE码格式),所以上面两行代码在ANSI码格式下不会报错,因为它返回的是char *多字节字符串,但是在UNICODE码格式下肯定会报错,因为此时它返回的是wchar_t *宽字节字符串,下面这么写就比较稳妥:

CString str = _T("Hello world!");
const char *msg = (char *)str.GetBuffer();//即使返回值是wchar_t *宽字节字符串,手动强制转换成char *

当然了,如果不嫌麻烦,最最最稳如老狗的方法还是我在上面说的TCHAR *类型字符串:

CString str = _T("Hello world!");
TCHAR *msg = str.GetBuffer();

windows下宽字节和多字节的问题相关推荐

  1. 宽字节与多字节之间的转换

    string 与 wstring 相互间的转换 第一种方法 调用Windows的API函数WideCharToMultiByte()函数和MultiByteToWideChar()函数 第二种方法 使 ...

  2. 宽字节 多字节 单字节 的问题

    感觉比较混乱,学习了一通,做个记录. 着急在windows下面用的话,可以先看这个: VC++ Windows平台字符透明编程大总结 http://blog.csdn.net/hellothere/a ...

  3. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...

    在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令   #pragma pack ...

  4. c++多字节与宽字节字符串转换(windows平台)

    原文网址:http://www.asarea.me/showdiary.php?id=193 许久没有写技术日志了,今天写一篇关于字符串转换的. 大家都知道,在标准c++中有string和wstrin ...

  5. C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转

    C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转 代码: #include <Windows.h> #include <stdio.h> #include & ...

  6. 多字节与宽字节的区别

    多字节与宽字节 string wstring 互转 多字节字符集(MBCS,Multi-Byte Chactacter Set): 指用多个字节来表示一个字符的字符编码集合.一般英文字母用1Byte, ...

  7. 单字节字符串、宽字符串和多字节字符串

    调查报告:了解单字节字符串.宽字符串 和多字节字符串等C/C++语言字符串表示方 法,总结其原理.存储.操作.应用等特 征,并编制报告. 单字节字符串(Single-Byte): 原理:每个字符用一个 ...

  8. A2W和W2A :很好的多字节和宽字节字符串的转换宏

    作者:朱金灿 来源:http://blog.csdn.net/clever101 以前看<Window核心编程>,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideCh ...

  9. 字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码

    字符字节与编码 字符是人们常用的一些记号,比如"1", "汉", "お","℃"等等,包括各种语系的语言和一些符号都可以 ...

最新文章

  1. 实现大数据可视化的10个技巧
  2. OpenMP在ARM-Linux以及NDK中的编译和使用
  3. English Notes
  4. 详解Python垃圾回收机制
  5. python if main_Python:if __name__ == '__main__'
  6. iOS 数据持久化 NSUserDefault
  7. ConfigParser.InterpolationSyntaxError: ‘%‘ must be followed by ‘%‘ or ‘(‘, found: “%‘“
  8. tkinter的pack布局与place布局结合
  9. 2021-2025年中国厨房橱柜行业市场供需与战略研究报告
  10. Hvv近期0day总结一
  11. Optisystem中器件的学习(1-Visualizer Library、Sensors)
  12. srb (bug篇)
  13. 软件验收测试合格的标准
  14. pimple学习(1)pimple的使用
  15. Debian11.5 最小化安装后更改主机名、安装桌面、设置默认语言、时区、静态IP、局域网DNS等
  16. C语言中 “>>=,<<=,=,^=,|=” 分别表示什么意思? 举例说明
  17. “只要3分钟,我就能扒光你的隐私!” | 互联网时代,14亿中国人都在裸奔
  18. 使用FastAPI重写Django官网Polls教程
  19. 基于JSP酒店预订系统
  20. Python遥感图像处理应用篇(十八):GDAL +numpy对遥感图像归一化处理

热门文章

  1. 滴滴技术解读:自动驾驶基础架构如何以终为始,稳定先行?
  2. 【python】——爬虫03 数据提取[jsonpath模块、lxml模块]
  3. PHP TP5 加密解密
  4. OpenStack----Nova 计算服务器基础理论(持续更新)
  5. Libvirt API的C语言调用
  6. 第四章 SQL查询 之连接{自然连接,内连接,外连接(左外连接,右外连接,完全连接)}
  7. 中国大学MOOC文学欣赏与批评题库及答案
  8. 重雷震 (易經大意 韓長庚)
  9. WMI(windows management instrumentation)利用思路简介
  10. 条码软件如何制作矢量格式的条码文件