vs配置选项“使用多字节字符集”和“使用Unicode字符集”的区别

VS集成开发环境,字符集选择“使用多字节字符集”和“使用Unicode字符集”的直接区别就是:编译器是否增加了宏定义——UNICODE。当选择“使用Unicode字符集”时,编译器会增加宏定义——UNICODE;而选择“使用多字节字符集”时,编译器则不会增加宏定义——UNICODE。

而是否增加了宏定义UNICODE,则影响了一些Windows API的使用。例如:

例子1:MessageBox的使用

windows API对MessageBox的定义如下:

WINUSERAPI
int
WINAPI
MessageBoxA(__in_opt HWND hWnd,__in_opt LPCSTR lpText,__in_opt LPCSTR lpCaption,__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(__in_opt HWND hWnd,__in_opt LPCWSTR lpText,__in_opt LPCWSTR lpCaption,__in UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

当选用“使用Unicode字符集”时,调用函数MessageBox,实际使用的是MessageBoxW,MessageBoxW关于字符串的入参类型是LPCWSTR,使用MessageBox时,字符串前需加L

::MessageBox(NULL, L"这是一个测试程序!", L"Title", MB_OK);

当选用“使用多字节字符集”时,调用函数MessageBox,实际使用的是MessageBoxA,MessageBoxA关于字符串的入参类型是LPCSTR

::MessageBox(NULL, "这是一个测试程序!", "Title", MB_OK);

例子2:OutputDebugString的使用

windows API对OutputDebugString的定义如下:

WINBASEAPI
VOID
WINAPI
OutputDebugStringA(__in_opt LPCSTR lpOutputString);
WINBASEAPI
VOID
WINAPI
OutputDebugStringW(__in_opt LPCWSTR lpOutputString);
#ifdef UNICODE
#define OutputDebugString  OutputDebugStringW
#else
#define OutputDebugString  OutputDebugStringA
#endif // !UNICODE

当选则“使用Unicode字符集”时,调用函数OutputDebugString,实际使用的是OutputDebugStringW,OutputDebugStringW的入参的类型是LPCWSTR,使用OutputDebugString时,字符串前需加L

OutputDebugString(L"测试12345");

当选则“使用多字节字符集”时,调用函数OutputDebugString,实际使用的是OutputDebugStringA,OutputDebugStringA的入参类型是LPCSTR

OutputDebugString("测试12345");

因此,“使用Unicode字符集”和“使用多字节字符集”的直接区别是:编译器是否增加了宏定义——UNICODE。而是否增加了宏定义(UNICODE)则决定了Windows API函数参数有字符串时使用的多字节字符集还是宽字符字符集。

下面介绍多字节字符集还是宽字符(UNICODE)字符集的区别。

多字节字符集和宽字符(UNICODE)字符集的区别

要理解字节字符集还是宽字符(UNICODE)字符集的区别,首先先理解char与wchar_t的区别

1. char与wchar_t的区别

char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字符时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’我’)用2个char(两个字节)表示。

wchar_t被称为宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。用常量给wchar_t赋值是,需要在常量前面加L。

可从下面的例子和运行结果,看出两者的区别。

// Test0601.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
using namespace std;//多字节字符测试
void CharTest()
{cout << "********多字节字符测试********" << endl;char cChar1 = 'a';cout << "字符1 : " << cChar1 << "    字符1的长度" << sizeof(char) << endl;char cChar2 = '我';//无法输出正确结果cout << "字符2 : " << cChar2 << "    字符2的长度" << sizeof(char) << endl;/*char szChar3[2] = "我";//编译不通过,提示“数组界限溢出”cout << "字符3 : " << szChar3 << endl;*/char szChar4[3] = "我";//前两个字节存放汉字'我',最后一个字节存放字符串结束符\0cout << "字符4:" << szChar4 << "    字符4的字节长度 : " << strlen(szChar4) * sizeof(char) << endl;
}//宽字符测试
void WCharTest()
{wcout.imbue(locale("chs"));//将wcout的本地化语言设置为中文wcout << L"********多字节字符测试********" << endl;wchar_t wcChar1 = L's';wcout << L"字符1 : " << wcChar1 << L"    字符1的长度" << sizeof(wchar_t) << endl;wchar_t wcChar2 = L'中';// 正确,一个汉字用一个wchar_t表示wcout << L"字符2:" << wcChar2 << L"    字符2的长度" << sizeof(wchar_t) << endl;wchar_t wszChar3[2] = L"中";// 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0wcout << L"字符3:" << wszChar3 << L"    字符3的字节长度: " << wcslen(wszChar3) * sizeof(wchar_t) << endl;wchar_t wszChar4[3] = L"中国";wcout << L"字符串4 : " << wszChar4 << L"    字符串4的字节长度: " << wcslen(wszChar4) * sizeof(wchar_t) << endl;
}int main()
{//多字节字符测试CharTest();//宽字符测试WCharTest();system("pause");return 0;
}

运行结果

2. LPCSTR与LPCWSTR的区别

LPCSTR的定义如下

typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
typedef char CHAR;

LPCWSTR的定义如下

typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;
typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character

可以看出LPCSTR与LPCWSTR的区别即为char与wchar_t的区别

下面是常用的多字节和宽字节对照表。

多字节和宽字节对照表
多字节字符集 宽字节(UNICODE)字符集 通用
char wchar_t TCHAR
char* wchar_t* TCHAR*
LPSTR LPWSTR LPTSTR
LPCSTR LPCWSTR LPCTSTR

3. 多字节字符集及宽字节字符集的兼容

使用_T、TCHAR等实现程序对多字节字符集及宽字节字符集的兼容

Visual Studio——使用多字节字符集与使用Unicode字符集相关推荐

  1. Visual Studio——理解多字节编码与Unicode码

    多字节字符与宽字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t.  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表 ...

  2. 多字节字符集与Unicode字符集(CString char*和wchar_t* 容易出错的原因)

    1.基本概念 2.L与_T 3.char TCHAR 与 wchar_t,strcpy wcscpy与_tcscpy 4.LPSTR,LPCSTR,LPTSTR,LPCTSTR,LPWSTR,LPCW ...

  3. Pro Engineer Pro/Toolkit dll工程二次开发设置(Pro Engineer 3.0+Visual Studio 2005(C++))

    Proe3.0+Visual Studio 2005 Release版本配置: 1.包含protk库文件 2.项目->属性: ->配置属性->常规->MFC的使用:在共享dll ...

  4. Visual Studio——多字节编码与Unicode码

    多字节字符与宽字节字符 1) char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t.  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...

  5. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  6. Visual studio 与字符编码浅析

    转自:https://blog.csdn.net/liangbch/article/details/79608635 关于字符编码 1. 西方文字的编码. 1.1 ASCII 码,ASCII是通用的英 ...

  7. 【OpenGL相关】用高版本visual studio打开老版本的OpenGL工程文件可能会遇到的问题

    内容 OpenGL库资源 测试代码 操作流程 解决方法 更多的问题 2022/10/21补充 参考文章 在3D图形程序设计课程进行学习的过程中,老师为我们提供了一些课本上的工程案例,但是这些工程案例过 ...

  8. Qt不使用unicode字符集

    我们知道Visual Studio是可以设置字符集的,有多字节和Unicode两种选项. 那么Qt Creator可以吗? 答案是可以的,Qt Creator默认是使用Unicode字符集,这个从配置 ...

  9. vs2015 c语言安装选项,visual studio(VS2015)路径和工程属性设置

    visual studio(VS2015)路径和工程属性设置 VS 2015新建一个工程,右键属性,打开**工程属性页. 1.常规选项: a)输出目录 输出目录就是.exe,.ilk,*.pdb文件所 ...

  10. Visual Studio关于hook项目的简单使用

    参考 DLL注入_拦截技术之Hook方式: 可知 如果我想要使用hook的dll注入方式来获取其他程序的数据,则关键的对象有: 操作 启动程序和给dll传递程序线程id 的一个程序 对目标程序的消息进 ...

最新文章

  1. 作为谷歌开发者布道师,我为什么要写这本通俗的《数据压缩入门》(一)
  2. PHP编译为静态库,Linux下将Tinyxml编译为静态库
  3. 怎么让图片一直转圈_鼠标为什么一直在转圈?如何强制关闭程序?
  4. python起步输入-Python 起飞系列————起步(一)
  5. Oracle VM VirtualBox下各种视图切换
  6. (绝对正确)Zabbix基于lamp的安装流程
  7. MPU6050开发 -- 卡尔曼滤波
  8. git生成秘钥配置SSH公钥的简单方法
  9. php表格tr,jQuery+ajax实现动态添加表格tr td功能示例
  10. VC程序中运行其他程序的三种方法
  11. Windows Phone开发手记-WinRT下启动器替代方案
  12. linux中的轮询机制select/poll/epoll特点分析
  13. 运气真不错:3月取到的TeaVM恰好能够运行,之前之后都有问题
  14. 完美卸载IE8/IE7安装IE6
  15. 教你快速录制gif动图
  16. Ubuntu 16.04 中文输入法(搜狗输入法)安装记录
  17. 黑暗之光第2章:角色创建(魔法师和剑士)
  18. 华为手机哪一款手机是鸿蒙系统_华为鸿蒙系统哪一款手机在用
  19. 如何利用计算机计算高血压患病率,成年人高血压患病率怎么算
  20. 【连续介质力学】弹性与超弹性、粘弹性、弹塑性、柯西弹性

热门文章

  1. 在linux中PHP的集成环境吗,linux有没有php集成环境
  2. Vue项目demo汇总
  3. Ds918 ds3615 ds3617区别_苹果678有什么区别
  4. 【优化调度】基于NSGAII算法的车辆充电调度策略研究含Matlab代码
  5. 报表控件是什么?常见报表类型有哪些?
  6. 用WPF做报表控件(一)
  7. 多路归并算法从理论到应用(易懂)
  8. snakeyaml操作yml文件中注释的处理
  9. Python解压zip和rar文件
  10. 【软件工程师学硬件】之 单片机