编码知识

一、Unicode与多字节(ANSI

(1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性>>常规>>字符集中可选择Unicode字符集或者多字节字符集

(2) Unicode与多字节函数版本、字符、字符串类型的区别

Win32 API中大部分参数有字符串的函数都有两个版本

以A结尾,代表多字节版本 以W结尾,代表Unicode版本 根据版本自动选择的
如:CreateEventA 如:CreateEventW 如:CreateEvent

C运行库也有很多类似的函数

多字节版本 Unicode版本 自适应版本
strcpy wcscpy _tcscpy
strcat wcscat _tscscat
strlen wcslen _tcslen

函数有两种,所以字符也有两种

多字节字符 Unicode字符 自适应字符
char wchar_t TCHAR

(3) 常见Win32字符串类型

LPSTR、LPWSTR、LPTSTR、LPCTSTR

LP前缀,代表指针;STR后缀代表字符串

LPSTR:代表多字节

LPWSTR:代表Unicode

LPTSTR:T自适应

LPCTSTR:C代表const+T代表自适应

备注:变量类型使用自适应类型后如LPTSTR,相关字符串需要用TEXT()进行包裹

	const char* str = "hello";
const wchar_t* wstr = L"hello";
const TCHAR* tstr = TEXT("hello");

(4)关于_T()

        #ifdef _UNICODE
#define _T(X) L ## X //Unicode版本
#else
#define _T(X) X //多字节版本
#endif

(5)Unicode与多字节的选择

1.Unicode程序环境适应能力强,不会出现乱码问题

2.Unicode程序运行速度比多字节程序快。原因:Windows内部都是使用Unicode编码,多字节函数会将参数转码后交给Unicode函数

3.控制后台可使用多字节,GUI程序最好使用Unicode

二、Unicode

(1)Unicode实现方式:UTF-32

以4个byte为编码单元进行定长存储,调度器一次性下发4个byte进行存储任务

主要有两种方式:

大端法UTF-32BE:地址由小向大增加,而数据从高位往低位放 ,在网络上传输数据普遍采用的都是大端

小端法UTF-32LE:地址由小向大增加,而数据从低位往高位放,在英特尔处理器,Windows10操作系统,采用小端法。

(2)UTF-16

也有大小端模式

UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。所有wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值)

char chinese[] = "你";
//大小为3个byte,一个char存储结束符,两个char存储汉字字符‘你’ 1char:1byte
wchar_t wchinese[] = L"你";
//大小为4个byte, 一个wchar_t存储结束符,一个wchar_t存储汉字字符‘你’ 1wchar_t:2byte(window下)
auto size = sizeof(chinese); // 3 byte
auto wsize = sizeof(wchinese); // 4 byte
auto len = strlen(chinese); // 2个字符(除去结束符)
auto wlen = wcslen(wchinese); // 1个字符(除去结束符)

优势:就是大多数情况下一个wchar_t表示一个字符(包括中文字符)

坑:char *类型的字面值,最终内存使用何种编码方式完全取决于当前文件的编码方式

备注:在Windows上应该铭记没有char / std::string这种类型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string

(3)UTF-8

优势:无字节序的概念,不用考虑大小端问题,适用与字符串的网络数据传输

劣势:如上代码,一个char并不能表示一个汉字字符,往往需要两个char

三、ANSI

(1)概念

可以认为ANSI / MBCS (多字节字符集) / 本地编码是同一个概念,不同的国家和地区制定了不同的标准,有GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准,ASCII就是美国国家的ANSI标准,一个国家的代码到另一个国家使用,有可能由于编码标准不一致,导致乱码,于是才有了万国码Unicode,各国通用。

总结

最新文章

  1. CentOS下SNMP的安装与使用
  2. js处理匿名函数
  3. CMD命令之 :修改windows的CMD窗口输出编码格式为UTF-8
  4. 搭建自己的OpenWrt开发环境
  5. Windows Phone:如何检查WMAppManifest中的Capability属性
  6. SDUT 2411:Pixel density
  7. 【JavaScript】页面加载性能优化
  8. redundant 行记录格式
  9. greenplum和postgresql
  10. 使用exp&imp工具进行数据库备份及恢复
  11. Openjudge-计算概论(A)-第二个重复出现的数
  12. 网络推广 免费推广产品网站 B2B网站如何推广
  13. 跨域学习笔记1--跨域调用webapi
  14. c# 数组协变
  15. 独热编码和dummy编码的作用
  16. React Native库版本升级与降级
  17. python调用tcpdump抓包过滤
  18. [USACO07JAN]Balanced Lineup
  19. jsoup Cookbook(中文版)-Jsoup解析HTML
  20. zip&unzip范例

热门文章

  1. centos7下redis安全相关
  2. django 启动错误:Generator expression must be parenthesized 错误信息:
  3. 【WPF学习】第三十四章 资源基础
  4. 利用jQuery动态添加input输入框,并且获取他的值
  5. LR中解决接口请求中包含中文字符,服务器不识别的问题
  6. Java properties文件集
  7. javabst1an
  8. Codeforces 1062B Math(质因数分解)
  9. 纯JavaScript实现页面行为的录制
  10. drf路由分发、解析/渲染模块配置、使用admin、自动序列化配置