字符编码

乱码

主要原因有:

1. 文本文件的编码与解码程序不一致(如:浏览器把GBK码的网页当成Big5码进行显示)

2. 字体中没有对应文字的形状定义(表现为使用方框来填充)

ASCII / EASCII1个字节)- 起源

下面的ASCII表中:淡蓝色部分控制字符淡灰色部分可显示字符

EASCII是ASCII的扩充,新增了的符号包括表格符号计算符号希腊字母特殊的拉丁符号

http://www.rapidtables.com/code/text/ascii-table.htm

在Windows下,打开小键盘,按住ALT键,然后输入EASCII码[如:按住ALT键并依次输入数字键区数字2、4、7可输入÷]。

在Vim中,在插入模式下,可以先按Ctrl-V,再输入代表EASCII码的(至多三位)十进制数字。

ASCII/EASCII编码被世界上任意一种字符编码所兼容!!

GB2312、GBK、GB18030多字节字符集【MBCS】,最常见的MBCS实现是双字节字符集 (DBCS))- 各自为政

【内容】:

GB2312字符集中除常用简体汉字字符外还包括希腊字母日文平假名片假名字母俄语西里尔字母等字符共7445个字符。

GBK增加了繁体字生僻字汉字部首符号竖排标点符号等内容,是GB2312编码的超集,向下完全兼容GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。共20902个字符。

GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。

【特点】:

GB2312和GBK都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。

GB18030编码是变长编码,有单字节、双字节和四字节三种方式。

GB18030 > GBK > GB2312,依次向下兼容。

除了GB系列的中文编码方式外,世界各个地区也都有自己的编码方式,例如:港澳台地区的繁体汉字Big5编码日本的SJIS编码韩国的KSC编码

这些字符编码之间不兼容,互相冲突,给全球信息交换带来了很大的麻烦。

UNICODE - 天下归一

标准方式ucs2ucs4

ucs2:用两个字节编码;可容纳65536个字符,基本可以包含世界所有国家的常用文字了。

ucs4:用四个字节编码;可容纳2147483648(21亿)个字符,如果需要考虑一些偏僻字,那么ucs4则绝对可以满足了。

标准方式将所有字符一视同仁,会带来浪费空间的问题,因此,人类在标准方式的基础上,发明了uft编码。

实现方式utf8utf16utf32

utf8以字节为单位对Unicode进行编码,一个英文字符占1个字节,汉字占3个字节;

utf16以16位无符号整数为单位对Unicode进行编码,中文英文都占2个字节;utf16可看成是ucs2的父集。对于两个字节的ucs码,utf16编码就等于ucs码。

       英文范围:0x0000-0x007F    中文范围:0x4E00-0x9FBF

utf32以32位无符号整数为单位对Unicode进行编码,中文英文都占4个字节。utf32可看成是ucs4的父集,目前uft32完全等同于ucs4。

中文"汉字"的utf8、utf16、utf32的编码如下:

1 BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
2 WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
3 DWORD data_utf32[] = {0x00006c49, 0x00005b57}; // UTF-32编码

小端大端(uft16、uft32) 

x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。注:windows系统使用的x86的处理器,因此windows为小端序
Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian
ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。

文本文件在起始处使用BOM(Byte Order Mark)来区分不同字节序的utf编码,具体如下:

 

在线工具  http://tool.chinaz.com/tools/unicode.aspx

                http://www.haomeili.net/Code/DetailCodes?wd=%E4%B8%AD 

windows记事本

注:ANSI - 表示使用本地系统的字符集

notepad++

 

注:ANSI - 表示使用本地系统的字符集

vs2008

vs2008工程字符集设置

注:未设置 - 表示使用本地系统的字符集。

本地系统的字符集可用GetACP()获取当前的codepage值来得到,codepage值与字符集的对应表在这里!!!

可以在“区域和语言”面板中通过“更改系统区域设置”来修改当前的codepage值。

 

windows对unicode的支持

Windows操作系统内核中的字符表示为UTF-16小尾序,可以正确处理、显示以4字节存储的字符。

但是WindowsAPI实际上仅能正确处理UCS-2字符,即仅以2字节存储的,码位小于U+FFFF的Unicode字符。

其根源是Microsoft C++语言把wchar_t数据类型定义为16比特的unsigned short,

这就与一个wchar_t型变量对应一个宽字符,可以存储一个Unicode字符的规定相矛盾。

相反,Linux平台的GCC编译器规定一个wchar_t是4字节长度,可以存储一个UTF-32字符,宁可浪费了很大的存储空间。

验证程序:

参考

中文编码杂谈

字符编码的前世今生

原文地址:https://www.cnblogs.com/kekec/p/3383231.html