字符集 | 文本存储 | 说明 | 参考 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)~57为0到9十个阿拉伯数字。 65(0x41)~90为26个大写英文字母 97(0x61)~122(0x7A)号为26个小写英文字母 | 在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1 | ||
ANSI 各国家自己的字符集标准 American National Standard Institite,美国国家标准协会 | ANSI | 将ascii码扩展到8bits,增加了0x80-0xff共128个字符。在cjk(chinese japanese korean)系统中,ansi还常常指代包括多字节内码的编码。在大陆地区使用ANSI存储汉字会用GB2312编码,只能保存大概7千多个汉字 |
| |||
记事本 | 记事本保存带BOM,但可以识别无BOM的UTF8和Ascii | 记事本里面有四个选项: 1)ANSI是默认的编码方式。对于英文是ASCII编码,对于简体中文是GB2312编码(如果是繁体中文版会采用 Big5 码)。 2)Unicode: UTF-16存储方式,这个选项用的 little endian 格式。 3)Unicode big endian:UTF-16大端,常用,符合阅读习惯,高位开始 4)UTF-8:带BOM保存 | ||||
GB系列 DBCS(Double Byte Charecter Set 双字节字符集) ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的 | GB2312 | 1980年GB2312收录7445汉字:高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。疑问:为什么每个区第一个字节和最后一个字节不用(每一区的A0和FF,比如第一区的A0A0,A0FF) | 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-FE7E,FE80-FEA0 1995年的汉字扩展规范GBK1.0收录了21886个符号,包括21003个汉字和883个其它符号。这21003汉字包括CJK统一汉字区的20902个汉字。余下的101个汉字包括:增补汉字和部首80个,包括28个部首和52个汉字。在制定GBK时,Unicode中还没有这些字符,所以使用了专用区的码位,这80个字符的码位是0xE815-0xE864。后来,Unicode将52个汉字收录到“CJK统一汉字扩充A”。28个部首中有14个部首被收录到“CJK部首补充区”。所以在上图中,这些字符都有两个Unicode编码。 | 汉字字符集编码查询:https://www.qqxiuzi.cn/bianma/zifuji.php | |||
GB18030 | GB18030有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,共27484个汉字,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字,包括少数民族汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。本文数一数GB18030中的汉字,也顺便看看其它标准中的汉字。 | |||||
繁体中文 | Big5 | 1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,因其来源被称为五大码,英文写作Big5,后来按英文翻译回汉字后,普遍被称为大五码。 | 繁体汉字13053个,808个标点符号、希腊字母及特殊符号。大五码的编码码表直接针对存储而设计,每个字符统一使用两个字节存储表示。第1字节范围81H-FEH,避开了同ASCII码的冲突,第2字节范围是40H-7EH和A1H-FEH。因为Big5的字符编码范围同GB2312字符的存储码范围存在冲突,所以在同一正文不能对两种字符集的字符同时支持。 | |||
Unicode统一码万国码单一码学名是Universal Multiple-Octet Coded Character Set,简称为UCS(Unicode 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,korean)4E00-9FA5,总共20927个汉字 D800-DFFF为空段,映射辅助平面字符 | https://blog.csdn.net/hezh1994/article/details/78899683在Unicode 5.0的99089个字符中,有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标准建议用BOM(Byte 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位码元来表示码位,也就是说在0到0xFFFF的码位范围内,它和UTF-16基本一致。但它不能表示基本平面BMP以外的字符,所以被淘汰。 |
| ||||
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 0xDFB7。Unicode3.0 中给出了辅助平面字符的转换公式: H = Math.floor((c-0x10000) / 0x400)+0xD800 L = (c - 0x10000) % 0x400 + 0xDC00 | |||||
UTF-32每个字符使用4个字节编码 | ||||||
各领域编码 | Base64 | 原文的字节数量应该是3的倍数,如果这个条件不能满足的话,具体的解决办法是这样的:原文剩余的字节根据编码规则继续单独转(1变2,2变3;不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。因为一个原字节至少会变成两个目标字节,所以余数任何情况下都只可能是0,1,2这三个数中的一个。如果余数是0的话,就表示原文字节数正好是3的倍数(最理想的情况)。如果是1的话,转成2个Base64编码字符,为了让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资源的字符串的各个不同部分。URL是URI的一个特例,它包含了定位Web资源的足够信息。在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。 | foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/ \________/\_________/ \__/ | | | | | scheme authority path query fragment |