大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
1、
ANSI编码不是一个具体的字符集,而是对一些多字节字符集类型的字符集(的集合)的一个总体的称呼,总称。
(Windows)ANSI编码中的每一个代码页值就是对一个具体的多字节字符集类型的字符集的别名。例如,代码页 936 就是Windows系统对简体中文GBK这个字符集的别名。
如果ANSI编码是一个具体的字符集,由于汉字和韩文字符都是它能表示的字符,那么里面写有韩文字符的以(Windows)ASNI 朝鲜语代码页949编码保存的文件再向他写入中文保存文件后再打开发现中文部分显示为乱码,而Unicode字符集是一个具体的字符集,汉字和韩文字符都是它能表示的字符,以Unicode字符集保存的文件里则能同时正确显示汉字和韩文字符。
或者里面写有韩文字符的以(Windows)ASNI 朝鲜语代码页949编码保存的文件改为用(Windows)ASNI 中文代码页936编码保存后再打开该文件应该还是显示正常才对,而事实是会显示乱码。
所以说,ANSI编码不是一个具体的字符集。
如果说ANSI编码是一个具体的字符集,各个代码页是旗下的一个个子字符集,那么这个说法又对吗?
在MBCS下,字符被编码为单字节或双字节。在双字节字符中,第一个字节(即前导字节)表示它和下一个字节将被解释为一个字符。第一个字节来自留作前导字节的代码范围。哪个范围的字节可以用作前导字节取决于所使用的代码页。例如,日文代码页 932 使用 0x81 到 0x9F范围内的字节作为前导字节,而朝鲜语代码页 949 则使用其他范围的字节。
http://blog.csdn.net/slj0609/article/details/2913146
编码方式
字符有一字节和双字节编码,00
–7F
范围内是第一个字节,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。
之后的双字节中,前一字节是双字节的第一位。总体上说第一字节(即前导字节)的范围是81
–FE
(也就是不含80
和FF
),第二字节的一部分领域在40
–7E
,其他领域在80
–FE
。
具体来说,定义的是下列字节:
范围 | 第1字节 | 第2字节 | 编码数 | 字数 |
---|---|---|---|---|
水准 GBK/1 | A1 –A9 |
A1 –FE |
846 | 717 |
水准 GBK/2 | B0 –F7 |
A1 –FE |
6,768 | 6,763 |
水准 GBK/3 | 81 –A0 |
40 –FE (7F 除外) |
6,080 | 6,080 |
水准 GBK/4 | AA –FE |
40 –A0 (7F 除外) |
8,160 | 8,160 |
水准 GBK/5 | A8 –A9 |
40 –A0 (7F 除外) |
192 | 166 |
用户定义 | AA –AF |
A1 –FE |
564 | |
用户定义 | F8 –FE |
A1 –FE |
658 | |
用户定义 | A1 –A7 |
40 –A0 (7F 除外) |
672 | |
合计: | 23,940 | 21,886 |
http://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83
日文代码页 932 使用 0x81 到 0x9F范围内的字节作为前导字节,简体中文代码页936使用的前导字节的范围是
0x81–
0xFE
(也就是不含80
和FF
),即两个代码页间的前导字节的表示范围有重合的部分。如果ANSI编码是一个具体的字符集,各个代码页是旗下的一个个子字符集(如何区分不同字符集即用各个子字符集所用的前导字节的表示范围不同来区分),而这里两个代码页间的前导字节的表示范围有重合的部分,故而无法通过前导字节的表示范围不同来区分不同字符集,所以“ANSI编码是一个具体的字符集,各个代码页是旗下的一个个子字符集”的说法也是不对的。
从以下情况也可看出ANSI编码不是一个具体的字符集:
GB 18030与 UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
其字节结构如下:
- 单字节,其值从0到0x7F。
- 双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F)。
- 四字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39。
http://zh.wikipedia.org/wiki/GB_18030
由此看出,
代码页54936 —简体中文(GB18030)是一个四字节字符集类型的字符集,而代码页936 —简体中文(GBK)是一个双字节字符集类型的字符集,所以说ANSI编码不是一个具体的字符集,因为一个具体字符集不会属于四字节字符集类型的字符集的同时又是属于一个双字节字符集类型的字符集,它只能是属于一种(编码方案)类型的字符集。
附加:
中日韩语言代码页
既是OEM代码页,也是Windows代码页。
- 20936 —简体中文(GB2312) GB 2312 查看 字节结构表示范围
- 936 —简体中文(GBK) GBK即汉字内码扩展规范 查看 字节结构表示范围
- 54936 —简体中文(GB18030) GB 18030 查看 字节结构表示范围
- 950 —繁體中文(大五碼)
- 932 —日文(Shift_JIS)
- 949 —韓文(EUC-KR)
Unicode 默认说指是Unicode 小端字符集,Unicode和BigEndianUnicode 区别
这两者只是存储顺序不同,如"A"的unicode编码为65 00 ,BigEndianUnicode编码为00 65
美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。
2、
由于例如中文字符集(如字符集GBK)和韩文字符集(如代码页949)这两种多字节字符集类型的字符集各自所表示的字符没有存在相同的字符,故而两者间无法进行字符(编码值)转换。例如,汉字”龙“不存在于一具体的韩文字符集里,则用字符集GBK表示的汉字”龙“就无法转换成在该韩文字符集里的编码值了,该韩文字符集可能用该字符集的默认字符?来替代在它里面不存在的字符,或者干脆不转换汉字”龙“在字符集GBK中的编码值就原值保存,这样再次打开文件时以该韩文字符集读取汉字”龙“在字符集GBK中的编码值时就显示为乱码。
由于每种多字节字符集类型的字符集各自所表示的字符都存在于Unicode字符集中,所以每种多字节字符集类型的字符集和Unicode字符集间一般都可以相互转换。虽然由于各种字符集设计时未考虑到相互间简便转换方式问题即用一个算法公式就可以进行相互转换,但是我们可以通过事先建立好的一个映射表来转换。
映射表(一行内容)例子如下:
字符 字符集GBK里的编码值 Unicode字符集里的编码值
“龙” XXXXX YYYY
注释:
Windows操作系统中使用的代码页
Windows平台上的GUI程序使用ANSI代码页,而在控制台程序使用OEM代码页(以便向后兼容)。这意味着,如果在记事本程序(notepad.exe)打开一个8位字符集编码的文本文件,将使用ANSI代码页;如果在命令行中用type命令显示这个文本文件的内容,将使用OEM代码页。这两个代码页在前128个字符的编码是一样的,但后128个字符的编码可能不一致。在Windows的命令行窗口通过标记、复制操作把一部分文本内容复制到记事本程序中,实际上是把Unicode格式的内容保存在剪贴板,使得这种文本复制保持了字符编码的透明转换。
对于Windows操作系统中的命令行窗口(Command Prompt),chcp命令在没有参数时,显示当前代码页;chcp命令带一个整数参数,则改变命令行窗口的当前代码页为参数所指定。
http://zh.wikipedia.org/zh/%E4%BB%A3%E7%A0%81%E9%A1%B5#.E6.9F.A5.E8.AF.A2.E4.BB.A3.E7.A0.81.E9.A1.B5.E7.9A.84.E4.BF.A1.E6.81.AF
3、
由于在Unicode中英文字符也是用两个字节表示,这有点浪费存储空间,所以UTF-8的设计时英文字符用一个字节表示(UTF-8保留了Unicode可以表示国际各种语言的字符的特性),这可以节省存储空间,网络传输量,毕竟网络传输多数是英文。
从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) UTF-8 字节流(二进制)
0000 – 007F (英文字符) 0xxxxxxx
0080 – 07FF 110xxxxx 10xxxxxx
0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx
4、关于与ANSI编码相关的locale即区域设置:
wchar_t是C/C++的字符类型,是一种扩展的存储方式(看含有locale对象的代码)
5、
GBK与CP936字码表比较
微软的CP936通常被视为等同GBK,连 IANA 也以“CP936”为“GBK”之别名[1]。事实上比较起来, GBK 定义之字符较 CP936 多出95字(15个非汉字及80个汉字),皆为其时未收入 ISO 10646 / Unicode 之符号:非汉字包括异体字符号[2]、十二个表意文字描述字元(Ideographic Description Characters)[3]及 GB 5007.1-85《信息交换用汉字 24×24 点阵字模集》附录对 GB 2312 增加,但 Unicode 未收之拼音符号“ḿ”和“ǹ”[4][5];汉字包括未收入 ISO 10646 的《简化字总表》汉字52个、《康熙字典》及《辞海》汉字部件28个[4]。CP936中的这95字分配到了Unicode的私有区域[6][7],现已全部收于新版 Unicode。
GBK即汉字内码扩展规范
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/194080.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...