C/C++ unicode和多字节区别

最后更新于:2020-06-04 23:05:15

 

unicode和多字节字符集是两种不同的编码方式,不同的编码方式下,所对应的一些函数和字符串表示也是不相同的(关于编码问题,始终是你命中注定的劫,逃不掉的….)

 

一.字符串在unicode和多字节字编码中的区别

字符串在unicode和多字节编码中分别用不同的类型表示:

在`windows.h`中有如下定义:

typedef char CHAR; 
typedef wchar_t WCHAR;

 

unicode编码下,字符串对应的类型:wchar_t / WCHAR

多字节编码下,字符串对应的类型:char/CHAR

 

char多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’中’)用3个char(三个字节)表示,看下面的例子:

/************************************************************************/
/*@文件名      : char_printf.cpp                                                       
/*@日  期      : 2020/5/31 19:37
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - char使用printf输出到控制台
/************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include "windows.h"

int main()
{
	char ch1 = 's';              // 正确
	printf("ch1:%c\n" ,ch1);
	char ch2 = '中';             // 错误,一个char不能完整存放一个汉字信息
	printf("ch2:%c\n", ch2);	 //显示乱码

	char str[4] = "中";          //前三个字节存放汉字'中',最后一个字节存放字符串结束符\0
	printf("str:%s\n", str);
	//char str2[2] = "国";       // 错误:'str2' : array bounds overflow(数组边界溢出)
	//printf("str2:%s\n", str2);

	system("pause");
	return 0;
}

输出:

ch1:s
ch2:?
str:中
请按任意键继续. . .

 

 

wchar_t被称为宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。看下面的例子:

/************************************************************************/
/*@文件名      : char_wprintf.cpp                                                       
/*@日  期      : 2020/5/31 19:37
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - wchar使用wprintf输出到控制台/printf输出宽字节乱码
/************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
#include <Locale.h>

int main()
{

	setlocale(LC_ALL, "chs");       // 本地化语言设置为中文,否则中文乱码

	wchar_t wch1 = L's';            // 正确
	wprintf(L"wch1:%c\n", wch1);
	wchar_t wch2 = L'中';            // 正确,一个汉字用一个wchar_t表示
	wprintf(L"wch2:%c\n", wch2);

	wchar_t wstr[2] = L"中";         // 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0
	wprintf(L"wstr:%s\n", wstr);
	wchar_t wstr2[3] = L"中国";
	wprintf(L"wstr2:%s\n", wstr2);


	system("pause");
	return 0;
}

输出:

wch1:s
wch2:中
wstr:中
wstr2:中国
请按任意键继续. . .

 

注意:

1.对于宽字节字符串或者字符显示到控制台,不能使用printf,需要使用wprintf或者wprintf_s;

2.宽字节字符串与多字节字符串不同,宽字节字符串前面有L修饰;

 

 

 

二.函数在unicode和多字节字编码中的区别

 

Win32 API中大部分参数有字符串的函数都有两个版本,以A结尾/开头,代表多字节版本,以W结尾/开头,代表Unicode版本,两者互不兼容,例如:

printf     //输出字符串到控制台  -- 多字节
wprintf    //输出字符串到控制台  -- 宽字节

outputdebugstringA   //输出字符串  -- 多字节
outputdebugstringW   //输出字符串  -- 宽字节

strcpy/strcpy_s  //拷贝字符串  -- 多字节
wcscpy/wcscpy_s  //拷贝字符串  -- 宽字节

strcat/strcat_s  //在字符串尾部添加字符串  -- 多字节
wcscat/wcscat_s  //在字符串尾部添加字符串  -- 宽字节

strlen     //计算字符串大小  -- 多字节
wcslen     //计算字符串大小  -- 宽字节

.......

 

多字节编码和unicode编码下,各自函数互不兼容,必须使用和编码格式对应的函数;

 

 

 

猜你喜欢:

1.安装 Visual Studio 2015

2.安装 Visual Studio 插件 Visual Assist

3.设置 Visual Studio字体/背景/行号

4.彻底卸载 Visual Studio 2008

5.彻底卸载 Visual Studio 2013/2015

 

转载请注明猿说编程 » C++教程 » unicode和多字节字区别



技术交流、商务合作请直接联系博主扫码或搜索:猿说编程

python/C++教程

猿说编程微信公众号 扫一扫关注

 

 

赞赏

微信赞赏支付宝赞赏