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

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门


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


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

字符串在 Unicode 和多字节编码中分别用不同的类型表示,在 windows.h 中有如下定义:

typedef char CHAR; 
typedef wchar_t WCHAR;

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

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


char 叫多字节字符,一个 char 占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。

一个英文字符(如’s’)用一个 char (一个字节)表示,一个中文汉字(如’中’)用 3 个 char (三个字节)表示,看下面的例子:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C/C++ Unicode 和多字节区别
//@Time:2021/08/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#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 )来表示,不管是英文还是中文。看下面的例子:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C/C++ Unicode 和多字节区别
//@Time:2021/08/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#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. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. C语言 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 #运算符
  16. C语言 ##运算符
  17. C语言 __VA_ARGS__
  18. C语言 ##__VA_ARGS__
  19. C语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C语言 va_start / va_end / va_arg 自定义 printf 函数
  21. C语言 main 函数
  22. C语言 main 函数参数 main(int argc, char *argv[])
  23. C语言 局部变量
  24. C语言 全局变量
  25. C语言 全局变量和局部变量区别
  26. C语言 static
  27. C语言 extern
  28. C/C++ putchar函数
  29. C/C++ getchar函数
  30. C/C++ Unicode 和多字节区别

ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞2 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容