字符集&编码总结表格

字符集

文本存储

 

说明

参考 http://www.fmddlmyy.cn/text24.html

 

ASCII
American Standard Code for Information Interchange
,美国信息互换标准代码

所有编码方式都兼容ASCII

 

1967年发布规范标准,最后一次更新则是在1986
0x20
以下的字节状态称为“控制码”
0 0x00 NUL(null)
空字符    8 0x08 BS(backspace) 退格
10 0x0A LF(NL line feed, new line)
换行键(\n:  UNIX 系统行末结束符)
13 0x0D CR(carriage return)
回车键(\r:  MAC OS 系统行末结束符)
\n\r: window
系统行末结束符
软回车 Shift+Enter(html:<br/> 硬回车(html:<p></p>


32 0x20(space)
空格
127 0x7F DEL(delete)
删除
48(0x30)
5709十个阿拉伯数字。
65(0x41)
9026个大写英文字母
97(0x61)
122(0x7A)号为26个小写英文字母

在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b71;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b71

ANSI 各国家自己的字符集标准
American National Standard Institite
,美国国家标准协会

ANSI

 

ascii码扩展到8bits,增加了0x80-0xff128个字符。在cjkchinese japanese korean)系统中,ansi还常常指代包括多字节内码的编码。
在大陆地区使用ANSI存储汉字会用GB2312编码,只能保存大概7千多个汉字

 


 

记事本

记事本保存带BOM,但可以识别无BOMUTF8Ascii

 

记事本里面有四个选项:
1
ANSI是默认的编码方式。对于英文是ASCII编码,对于简体中文是GB2312编码(如果是繁体中文版会采用 Big5 码)。
2
Unicode UTF-16存储方式,这个选项用的 little endian 格式。
3
Unicode big endianUTF-16大端,常用,符合阅读习惯,高位开始
4
UTF-8:带BOM保存

   

GB系列
DBCS
Double Byte Charecter Set 双字节字符集)
ASCII
GB2312GBKGB18030的编码方法是向下兼容的

GB2312

 

1980GB2312收录7445汉字:高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE

疑问:为什么每个区第一个字节和最后一个字节不用(每一区的A0FF,比如第一区的A0A0A0FF)

GB2312编码对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。这种表示方式也称为区位码。
01-09
区收录除汉字外的682个字符。A1A1开始
10-15
区为空白区,没有使用。
16-55
3755个一级汉字,按拼音排序。5个空位D7FA-D7FE
56-87
3008个二级汉字,按部首/笔画排序。
88-94
区为空白区,没有使用。FEFE结尾
举例来说,“啊”字是GB2312编码中的第一个汉字,它位于16区的01位,所以它的区位码就是1601(0xB0A1)

GB2312编码表:https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php

GBK

增加繁体字

GBK编码是从FE50-FE7EFE80-FEA0
1995
年的汉字扩展规范GBK1.0收录了21886个符号,包括21003个汉字和883个其它符号。这21003汉字包括CJK统一汉字区的20902个汉字。余下的101个汉字包括:
增补汉字和部首80个,包括28个部首和52个汉字。
在制定GBK时,Unicode中还没有这些字符,所以使用了专用区的码位,这80个字符的码位是0xE815-0xE864。后来,Unicode52个汉字收录到“CJK统一汉字扩充A”。28个部首中有14个部首被收录到“CJK部首补充区”。所以在上图中,这些字符都有两个Unicode编码。

 

汉字字符集编码查询:https://www.qqxiuzi.cn/bianma/zifuji.php

GB18030

 

GB18030有两个版本:GB18030-2000GB18030-2005GB18030-2000GBK的取代版本,共27484个汉字,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字,包括少数民族汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。本文数一数GB18030中的汉字,也顺便看看其它标准中的汉字。

   

繁体中文

Big5

 

1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,因其来源被称为五大码,英文写作Big5,后来按英文翻译回汉字后,普遍被称为大五码。

繁体汉字13053个,808个标点符号、希腊字母及特殊符号。大五码的编码码表直接针对存储而设计,每个字符统一使用两个字节存储表示。第1字节范围81HFEH,避开了同ASCII码的冲突,第2字节范围是40H7EHA1HFEH。因为Big5的字符编码范围同GB2312字符的存储码范围存在冲突,所以在同一正文不能对两种字符集的字符同时支持。

 

Unicode
统一码
万国码
单一码
学名是Universal Multiple-Octet Coded Character Set,简称为UCSUnicode Character Set

UTF:
简称
UCS Transformation Format

1990年开始研发,1994年正式公布
只是一个符号集,它只规定了符号的二进制代码,最新版本是2005年的Unicode4.1.0

 

前面的 65536 个字符位于基本平面(Basic Multilingual Plane),缩写为BMP,总共定义了17个平面
0000-00FF
ASCII(0000-007F基本拉丁文,后面是拉丁文补充)
中文范围(CJK 统一表意符号,chinese,japanese,korean4E00-9FA5,总共20927个汉字
D800-DFFF
为空段,映射辅助平面字符

https://blog.csdn.net/hezh1994/article/details/78899683
Unicode 5.099089个字符中,有71226个字符与汉字有关。分布
Block
名称 开始码位 结束码位 字符数
CJK
统一汉字 4E00 9FBB 20924
CJK
统一汉字扩充A 3400 4DB5 6582
CJK
统一汉字扩充B 20000 2A6D6 42711
CJK
兼容汉字 F900 FA2D 302
CJK
兼容汉字 FA30 FA6A 59
CJK
兼容汉字 FA70 FAD9 106
CJK
兼容汉字补充 2F800 2FA1D 542

 

UTF-8
使用最广的一种 Unicode 的存储设计

 

Unicode 十六进制码点范围 UTF-8 二进制
0000 0000 - 0000 007F 0xxxxxxx
0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode标准建议用BOMByte Order Mark)来区分字节序
字节序有两种,分别是“大端”(Big Endian, BE)和“小端”(Little Endian, LE
UTF
编码 Byte Order Mark (BOM)
UTF-8 without BOM

UTF-8 with BOM EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

 

UCS2/UCS4

 

UCS-2 (2-byte Universal Character Set)是一种定长的编码方式,UCS-2仅仅简单的使用一个16位码元来表示码位,也就是说在00xFFFF的码位范围内,它和UTF-16基本一致。但它不能表示基本平面BMP以外的字符,所以被淘汰。

http://demon.tw/programming/utf-16-ucs-2.html

UTF-16
16-bit Unicode Transformation Format
基本平面字符用2字节,扩展平面字符用4字节保存(称为surrogate pair(代理对))

 

汉字"𠮷" Unicode 码点为 0x20BB7,该码点显然超出了基本平面的范围(0x0000 - 0xFFFF),因此需要使用四个字节表示。首先用 0x20BB7 - 0x10000 计算出超出的部分,然后将其用 20 个二进制位表示(不足前面补 0 ),结果为0001000010 1110110111。接着,将前 10 位映射到 U+D800 U+DBFF 之间,后 10 位映射到 U+DC00 U+DFFF 即可。U+D800 对应的二进制数为 1101100000000000,直接填充后面的 10 个二进制位即可,得到 1101100001000010,转成 16 进制数则为 0xD842。同理可得,低位为 0xDFB7。因此得出汉字"𠮷" UTF-16 编码为 0xD842 0xDFB7Unicode3.0 中给出了辅助平面字符的转换公式:
H = Math.floor((c-0x10000) / 0x400)+0xD800
L = (c - 0x10000) % 0x400 + 0xDC00

 

UTF-32
每个字符使用4个字节编码

       
           

各领域编码

Base64

 

原文的字节数量应该是3的倍数,如果这个条件不能满足的话,具体的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1223;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为一个原字节至少会变成两个目标字节,所以余数任何情况下都只可能是012这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2Base64编码字符,为了让Base64编码是4的倍数,就要补2个等号;同理,如果是2的话,就要补1个等号。

标准base64字符A-Z,a-z,0-9,+/,还有各领域变种(改变最后2个字符及结束符兼容其领域)
转换前 10101101,10111010,01110110
转换后 00101011, 00011011 ,00101001 ,00110110

非输出情况考虑base128更高效,但有什么场景需要?

 
 

URI包括:
URL(HTTP/FTP
……)
URN

网络传输使用

Javascript中各编码函数区别 安全字符(函数不会对这些字符进行编码)
escape
69个) */@+-._0-9a-zA-Z js1.0发布
encodeURI
82个) !#$&'()*+,/:;=?@-._~0-9a-zA-Z js1.5发布,编码完整URI
encodeURIComponent
71个) !'()*-._~0-9a-zA-Z js1.5发布,编码单个组件(参数)

URI = Universal Resource Identifier 统一资源标志符
URL = Universal Resource Locator
统一资源定位符
URN = Universal Resource Name
统一资源名称
url
urn有交集,但都是uri的子集
jdk.1.5
区分:URI是个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。URLURI的一个特例,它包含了定位Web资源的足够信息。
Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。

  foo://example.com:8042/over/there?name=ferret#nose
   \_/  \______________/ \________/\_________/ \__/
    |           |            |         |         |
  scheme    authority       path     query    fragment

posted on 2019-07-29 17:50  hawking_xu  阅读(196)  评论(0编辑  收藏  举报

导航