字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

这篇具有很好参考价值的文章主要介绍了字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 总结

需要注意字符集和字符编码是不同的。比如当我们提到“数据库使用的是unicode字符集”,这样的说法是错误的,数据库中的数据一定要具体到某一种字符编码,只提到字符集是没有意义的,例如数据库使用UFT-8编码。

字符集:字符和字符码的映射关系,例如在ASCII中a的字符码就是97,表示在字符集的97号位置上是字符’a’。
字符编码:字符与字节流的映射关系,例如在ASCII中’a’的字节流就是01100001,在UTF中根据编码方式的不同,可能是01100001或0000000001100001。
名字解释:

Code Point = 字符码
Character Set = 字符集
Character Encoding = 字符编码

1 常见编码

1.1 单字节编码:ASCII

ASCII使用1个字节(8个bit)来记录一组常用字符,见下表:
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

例如其中字母a的二进制位:1100 001 = 97,那么a在计算机中就可以用1100001来保存。

注意上表中其实只使用了7个二进制位,最高位b8没有使用。

所以目前ASCII只使用7个二进制位保存128个字符,还有128个位置未使用。

1.2 单字节编码:ASCII扩展OEM字符集

对于ASCII的第一次扩展:OEM(IBM PC)字符集,实际上就是使用了ASCII后面的128个位置,还是单字节字符集。

下面列举两种常用的:

ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

ISO/IEC 8859-2:1999,又称Latin-2或“中欧语言”
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
对于拉丁语国家,除了我们熟知的a-z、A-Z之外,还存在衍生拉丁字母:

Á	É	Í	Ó	Ú	Ý	À	È	Ì	Ò	Ù	Â	Ê	Î	Ô	Û	Ä	Ë	Ï	Ö	Ü	Ÿ
á	é	í	ó	ú	ý	à	è	ì	ò	ù	â	ê	î	ô	û	ä	ë	ï	ö	ü	ÿ

Ç	Ş	Ã	Õ	Ñ	Ą	Ę	Į	Ų	Æ	Œ	Ø	IJ	ẞ	Þ
ç	ş	ã	õ	ñ	ą	ę	į	ų	æ	œ	ø	ij	ß	þ

可以看到,对于拉丁语系国家,单字节可以覆盖所有字符,Latin编码足够使用了。

但是对于非拉丁语系国家,例如汉语,单字节编码的256个位置是远远不够的。

1.3 双字节编码:大五码、GB码

单字节编码在中文环境中显然是不够用的,中文区的标准编码是GB系列。

  • 大五码是早期繁体中文的事实标准,基本被GB码取代。
  • GB码初代没有包含繁体,到今天的国家标准GB18030已经囊括了基本所有中、少数民族、日、韩汉字。
    • 演进:GB2312(2字节)→扩展繁体字→GBK(2字节)→扩展少数民族中日韩等→GB18030国家标准(4字节)。
    • 注意GBK都是向下兼容的,即GB18030兼容GB2312,因为使用的编码位置没有重叠。

1.3.1 大五码

Big5码是一套双位元组字符集,使用了双八码储存方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE。在Big5的分区中:

0x8140-0xA0FE 保留给使用者自定义字元(造字区)
0xA140-0xA3BF 标点符号、希腊字母、特殊符号,包括在0xA259-0xA261,安放了九个计量用汉字:兙兛兞兝兡兣嗧瓩糎。
0xA3C0-0xA3FE 保留。此区没有开放作造字区用。
0xA440-0xC67E 常用汉字(5401字),字集来源除教育部“常用国字标准字体表”所列4808字外,并优先收编国中、国小教科书中常用字587字及异体字6字。先按笔画再按部首排序。
0xC6A1-0xC8FE 保留给使用者自定义字元(造字区)
0xC940-0xF9D5 次常用汉字(7652字),字集来源除教育部“次常用国字标准字体表”所列6330字外,并筛选编入教育部“罕用国字标准字体表”表中使用频率较高之1320字。亦是先按笔画再按部首排序。
0xF9D6-0xF9DC 七个倚天外字集的扩充字:碁銹裏墻恒粧嫺(此七字分别为“棋鏽裡牆恆妝嫻”之异体字)
0xF9DD-0xFEFE 保留给使用者自定义字元(造字区)

1.3.2 GBK

字符有一字节和双字节编码,007F范围内是第一个字节,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。

之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81FE(也就是不含80FF),第二字节的一部分领域在407E,其他领域在80FE

具体来说,定义的是下列字节:

范围 第1字节 第2字节 编码数 字数
水准GBK/1 A1A9 A1FE 846 717
水准GBK/2 B0F7 A1FE 6,768 6,763
水准GBK/3 81A0 40FE (7F除外) 6,080 6,080
水准GBK/4 AAFE 40A0 (7F除外) 8,160 8,160
水准GBK/5 A8A9 40A0 (7F除外) 192 166
用户定义 AAAF A1FE 564
用户定义 F8FE A1FE 658
用户定义 A1A7 40A0 (7F除外) 672
合计: 23,940 21,886

2 字符集标准

可以理解为标准是一套字符集的集合,根据本地化的规则选择使用哪个字符集。

注意这些标准互相是不兼容的。

2.1 ANSI

与字符集不同,另一个维度的概念是字符集标准:由于不同的地区定义了大量不同的字符集,就拿单字节编码的字符集来说,就有ASCII、latin等等,虽然前128个字符一样,但后128个字符就完全不同了。
标准协会选择了一些比较常用的单字节编码作为ANSI标准,ANSI不指定某一种具体的字符集,而是根据系统locale选择具体使用哪一种单字节字符集。

ANSI没有固定字符集。

2.2 ISO 8859-1

ISO 8859-1 也是一种编码标准,由欧洲开发。长度也是一个字节,前 0~127 与 ASCII 一致,剩下的128个字符大多是欧洲语言所使用的字符,所以可以认为ISO 8859-1是为欧洲语言所定制的一套编码标准。一般情况ISO 8859-1标准会使用Latin 1。

2.3 GBK

事实上我们使用的GBK、GB18030都是标准,但由于我们的标准只对应一套特定的字符集,所以可以认为GBK就是字符集。

3 大统一

字符集、标准种类繁多,但是无论使用哪一种字符集,都无法做到显示任意国家的字符,所以unicode字符集出现了。

3.1 unicode

unicode使用4字节共32个二进制位,为每个字符都确定了一个唯一的编码,由于整体搜索空间庞大,实际使用的量比较少。所以将整体分为了17组,叫做字符平面。平时使用0号平面即可覆盖大部分场景。0号平面也叫做基本多文种平面(Basic Multilingual Plane, BMP)。

from wiki:

字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

部分0号平面的分布:字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

3.2 字符码与字符编码解耦

强映射的问题

传统编码中,字符码与字符编码是完全绑定的,例如在ASCII中,'a’的字符码是97,'a’的字符编码也是97。

在输入’a’时,系统直接映射为0110 0001存入即可,这种强映射方式好处是使用简单,快捷。但缺点是不灵活,每个字符码编码出的结果是固定的,如果存在这样一个场景:unicode四个字节中,英文字母只占很少的一部分,如果客户只使用英文,unicode中永远只有1个字节的数据是有意义的,剩下三个字节都没用到,但是强映射的方式下,数据传输、存储只能用4个字节,造成非常大的浪费。

unicode将字符码与编码解耦

在unicode中,每一个字符保证有唯一字符码,将 字符码到存储二进制之间的“字符编码”过程独立出来,提供了三种编码方法:

  • UTF-8:使用1或2或3或4个字节。
  • UTF-16:使用2或4个字节
  • UTF-32:固定使用4个字节。
    字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

例如a在UTF-16下编码为0x0061占用两个字节,在UTF-8下编码为0x61占用一个字节。

4 总结

需要注意字符集和字符编码是不同的。比如当我们提到“数据库使用的是unicode字符集”,这样的说法是错误的,数据库中的数据一定要具体到某一种字符编码,只提到字符集是没有意义的,例如数据库使用UFT-8编码。

  1. 字符集:字符和字符码的映射关系,例如在ASCII中a的字符码就是97,表示在字符集的97号位置上是字符’a’。
  2. 字符编码:字符与字节流的映射关系,例如在ASCII中’a’的字节流就是01100001,在UTF中根据编码方式的不同,可能是011000010000000001100001

名字解释:

  • Code Point = 字符码
  • Character Set = 字符集
  • Character Encoding = 字符编码

5 Postgresql中的字符集

再看PG服务端支持的字符集支持,可以看到Name部分都是具体的字符编码方法,最通用的就是UTF8,支持所有语言,空间占用1-4字节。

截取部分:文章来源地址https://www.toymoban.com/news/detail-417810.html

Name Description Language Server? ICU? Bytes/Char Aliases
BIG5 Big Five Traditional Chinese No No 1–2 WIN950, Windows950
EUC_CN Extended UNIX Code-CN Simplified Chinese Yes Yes 1–3
EUC_JP Extended UNIX Code-JP Japanese Yes Yes 1–3
EUC_JIS_2004 Extended UNIX Code-JP, JIS X 0213 Japanese Yes No 1–3
EUC_KR Extended UNIX Code-KR Korean Yes Yes 1–3
EUC_TW Extended UNIX Code-TW Traditional Chinese, Taiwanese Yes Yes 1–3
GB18030 National Standard Chinese No No 1–4
GBK Extended National Standard Simplified Chinese No No 1–2 WIN936, Windows936
ISO_8859_5 ISO 8859-5, ECMA 113 Latin/Cyrillic Yes Yes 1
ISO_8859_6 ISO 8859-6, ECMA 114 Latin/Arabic Yes Yes 1
ISO_8859_7 ISO 8859-7, ECMA 118 Latin/Greek Yes Yes 1
ISO_8859_8 ISO 8859-8, ECMA 121 Latin/Hebrew Yes Yes 1
LATIN1 ISO 8859-1, ECMA 94 Western European Yes Yes 1 ISO88591
LATIN2 ISO 8859-2, ECMA 94 Central European Yes Yes 1 ISO88592
LATIN3 ISO 8859-3, ECMA 94 South European Yes Yes 1 ISO88593
LATIN4 ISO 8859-4, ECMA 94 North European Yes Yes 1 ISO88594
LATIN5 ISO 8859-9, ECMA 128 Turkish Yes Yes 1 ISO88599
LATIN6 ISO 8859-10, ECMA 144 Nordic Yes Yes 1 ISO885910
LATIN7 ISO 8859-13 Baltic Yes Yes 1 ISO885913
LATIN8 ISO 8859-14 Celtic Yes Yes 1 ISO885914
LATIN9 ISO 8859-15 LATIN1 with Euro and accents Yes Yes 1 ISO885915
LATIN10 ISO 8859-16, ASRO SR 14111 Romanian Yes No 1 ISO885916
SJIS Shift JIS Japanese No No 1–2 Mskanji, ShiftJIS, WIN932, Windows932
SQL_ASCII unspecified (see text) any Yes No 1
UTF8 Unicode, 8-bit all Yes Yes 1–4 Unicode

到了这里,关于字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LCD-STM32液晶显示中英文-(6.unicode字符集)

    目录 Unicode字符集和编码 UTF-32 UTF-16 UTF-8(重点:必须掌握) BOM ANSI         由于各个国家或地区都根据使用自己的文字系统制定标准,同一个编码在不同的标准里表示不一样的字符,各个标准互不兼容,而又没有一个标准能够囊括所有的字符,即无法用一个标准表达所有

    2024年02月16日
    浏览(41)
  • 算法加密与解密、字符编码与字符集

    加密保证数据不会被窃取或者修改 哈希算法 压缩映射 :散列又称为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。 哈希算法(Hash)又称摘要算法(Digest),哈希算法的目的就是为了验证原始数据是否被篡改。 主流的散列算法有MD5和

    2024年02月03日
    浏览(54)
  • Linux的字符集及编码

    Linux 字符集设置 1、查询 (1) 查看当前服务器字符集:  # locale  (2) 查看服务器支持的字符集:  # locale -a 2、修改linux系统字符集的方式有如下两种: (1) 直接设置变量的方式修改,命令如下两条命令: [root~]# LANG=\\\"xxx\\\" 或者  export  LANG=\\\"xxx\\\"  [root ~]# LC_ALL=\\\"xxx\\\"  或者  export LC_ALL

    2024年02月09日
    浏览(46)
  • VScode中怎么设置默认字符集编码

    《AUTOSAR谱系分解(ETAS工具链)》之总目录

    2024年02月03日
    浏览(47)
  • GB 2312字符集:中文编码的基石

    GB 2312字符集是中国国家标准委员会于1980年发布的一种中文字符集,是中国大陆最早的中文字符集之一。GB 2312字符集的发布填补了中国大陆中文编码的空白,为中文信息处理提供了基础。 标准中文电码查询 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/chi

    2024年03月09日
    浏览(44)
  • 【MySQL】关于数据库字符编码以及字符集排序相关知识

    通过设置表的字符集和排序规则,解决MySQL查询时不区分字母大小写、插入时不支持特殊字符的问题。 关于MySQL查询时不区分字母大小写、插入时不支持特殊字符的问题,只有修改表的字符集和排序规则才能根治,而且事半功倍。utf8mb4支持的最低mysql版本为5.5.3+,若不是,请

    2024年02月12日
    浏览(44)
  • (二)java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK

    不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK (一)SQL state [99999]; error code [17056]; 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK; nested exception (二)java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK java.sql.SQLException: 不支持的字符集 (在类路

    2024年02月09日
    浏览(35)
  • Redis如何把字符集的编码格式设置为UTF-8

    一、问题复现(编码错乱)         刚安装好的redis在使用的过程中,若使用到了汉字,则在显示的时候,汉字是不能够正常显示的,因为redis在解析的过程中,会将汉字转换成其他编码的格式,如下图: 二、Redis支持哪些类型的编码?         Redis是一款开源的内存数据

    2024年02月02日
    浏览(46)
  • 达梦数据库支持GB18030-2022中文编码字符集证明方法

    既然是证明就要做到有图有真相。 证明途径1:系统概览法 查看达梦数据库“管理工具”-“对象导航”-“管理服务器”-“系统概览”-“字符集编码”-”GB18030”. 看见”GB18030”字样就是证据之一。如果你没有看见这个字样,而是UTF8等其他字样,请重新安装产品吧,安装向导

    2023年04月18日
    浏览(59)
  • (一)SQL state [99999]; error code [17056]; 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK; nested exception

    不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK (一)SQL state [99999]; error code [17056]; 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK; nested exception (二)java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK 目录 一、报错解答 1、报错 2、背景 3、原

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包