零基础 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
三.猜你喜欢
- C语言 数组下标越界和内存溢出区别
- C语言 使用指针遍历数组
- C语言 指针和数组区别
- C语言 指针数组和数组指针区别
- C语言 野指针
- C语言 函数值传递和址传递
- C语言 函数不定长参数
- C语言 函数指针
- C语言 指针函数
- C语言 回调函数 callback
- C语言 #pragma once
- C语言 #include <> 与 #include “” 区别
- C语言 const 修饰函数参数
- C语言 const 和 define 区别
- C语言 #运算符
- C语言 ##运算符
- C语言 __VA_ARGS__
- C语言 ##__VA_ARGS__
- C语言 函数不定长参数 ##__VA_ARGS__经典案例
- C语言 va_start / va_end / va_arg 自定义 printf 函数
- C语言 main 函数
- C语言 main 函数参数 main(int argc, char *argv[])
- C语言 局部变量
- C语言 全局变量
- C语言 全局变量和局部变量区别
- C语言 static
- C语言 extern
- C/C++ putchar函数
- C/C++ getchar函数
- C/C++ Unicode 和多字节区别
ChatGPT 3.5 国内中文镜像站免费使用啦
暂无评论内容