Visual Studio——使用多字节字符集与使用Unicode字符集

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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

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

Visual Studio——使用多字节字符集与使用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

Jetbrains全家桶1年46,售后保障稳定

当选用“使用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] = "我";//前两个字节存放汉字'我',最后一个字节存放字符串结束符\0
	cout << "字符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)存放字符串结束符\0
	wcout << 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;
}

运行结果

Visual Studio——使用多字节字符集与使用Unicode字符集

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等实现程序对多字节字符集及宽字节字符集的兼容

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/201618.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • c语言int16_msgbox用法举例

    c语言int16_msgbox用法举例在看别人代码的时候看到了__int16定义的变量于是好奇,为什么不用int定义上网查了一下首先要知道这里的16是指16个位一个汉子有两个字节(byte)一个int有4个字节而一个字节有8个位(bit)也就是一个int有32个位(bit)而这里的__int16也就是一个汉字的长度但int是两个汉字的长度这样定义还有一个优点就是无论什么操作系统所定义出来的

  • mysql查询语句 和 多表关联查询 以及 子查询

    mysql查询语句 和 多表关联查询 以及 子查询mysql(三):mysql查询语句和多表关联查询以及子查询1.查询一张表:select*from表名;2.查询指定字段:select字段1,字段2,字段3….from表名;3.where条件查询:select字段1,字段2,字段3frome表名where条件表达式;例:select*fromt_

  • 英特尔处理器性能排行2021_intel芯片组天梯图

    英特尔处理器性能排行2021_intel芯片组天梯图用于企业服务站和工作站的电脑硬件要求会比较高,常用的处理器可能会用到英特尔至强xeonCPU处理器。而至强xeon系列的型号有很多,不同的型号的性能也有差异,那么至强cpu哪些比较好呢?下面小编就给大家分享下英特尔2021至强cpu性能排行天梯图,供大家参考。2021至强cpu性能排行天梯图前100名情况如下:(图片来源于网络)以上便是英特尔2021至强cpu性能排行天梯图前100名cpu的情况,大家可以根据自己的需求选择合适的cpu处理器即可。更多有用的系统知识和重.

  • 主、外键约束_创建主键约束

    主、外键约束_创建主键约束主、外键约束点关注不迷路,欢迎再来!主键和外键是两种类型的约束;1.主键是能唯一的标识表中的每一行,就是说这一列非空且值不重复,可以指定为主键;作用是用来强制约束表中的每一行数据的唯一性;2.外键是b表中的某一列引用的值来源于a表中的主键列。也是约束b表中的外键列的值必须取致a表中的主键列值,不是其中的值就不能插入b表中。可以形成a表b表的联系,保持数据的约束和关联性。创建主表主键…

    2022年10月20日
  • python调用so文件[通俗易懂]

    python调用so文件[通俗易懂]从文章一将各个算法整合:文章(一)算法传送门:如下整合的c++代码run.cpp:源码传输门地址:https://wwi.lanzoup.com/izAEa027198d#define__USE_GNU#include<iostream>#include<cstdlib>#define__USE_GNU#include<string>#include”stdio.h”#define__USE_GNU#include”strin

  • 在线校验哈希算法_哈希值查询

    在线校验哈希算法_哈希值查询地址http://www.atool9.com/hash.php

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号