1. ASCII码 2. 字符集 2.1 Unicode 统一码 万国码 2.1.1 Unicode的10大设计原则 2.1.2 Unicode联盟 2.2 UCS 通用编码字符集 2.3 Unicode vs UCS (ISO 10646) 3. 字符编码 3.1 现代编码模型 3.2 字符转换工具 3.3 Unicode的具体实现 3.4 Unicode编码比较 4. 更多相关wiki链接 5. 补充: 字符集检测 6. 更多参考
Unicode 系统 简单的说:
- 定义了一个标准(Unicode):字符与序列码点Code Point一一对应的字符集;
- 发布了一系列的编码规则(UTF-8, UTF-16等):码点编码到计算机使用及存储的具体二进制格式。
1. ASCII码
https://en.wikipedia.org/wiki/ASCII
https://zh.wikipedia.org/wiki/ASCII
ASCII (American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。ASCII是 IEEE里程碑 之一。
But:
ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数字和英式标点符号,因此只能用于显示现代美国英语(且处理naïve、café、élite等外来语时,必须去除附加符号)。虽然EASCII解决了部分西欧语言的显示问题,但对更多其他语言无能为力。
So:
为了让计算机方便处理多国文字,所以就有了Unicode(统一码 万国码). 现在的软件系统大多采用Unicode。
2. 字符集
2.1 Unicode 统一码 万国码
https://www.unicode.org/versions/
https://en.wikipedia.org/wiki/Unicode
https://zh.wikipedia.org/wiki/Unicode
Unicode (中文: 万国码、国际码、统一码、单一码) 是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
该标准由非盈利的Unicode协会维护,截至2019年5月,最新版本Unicode 12.1包含字符超过13万个,涵盖150个现代和历史脚本,以及多个符号集和表情符号。
Unicode标准的字符库与ISO/IEC 10646同步,并且两者都是相同的。定义了每个字符的唯一标识(即字符的数字值,或者叫做代码点)
2.1.1 Unicode的10大设计原则
https://zh.wikipedia.org/wiki/Unicode#10大设计原则
《The Unicode Standard Version 6.2 – Core Specification》文档给出了 Unicode 的十大设计原则:
- Universality:提供单一、综合的字符集,编码一切现代与大部分历史文献的字符。
- Efficiency:易于处理与分析。
- Characters, not glyphs:字符,而不是字形。
- Semantics:字符要有良好定义的语义
- Plain text:仅限于文本字符
- Logical order:默认内存表示是其逻辑序
- Unification:把不同语言的同一书写系统(scripts)中相同字符统一起来。
- Dynamic composition:附加符号可以动态组合。
- Stability:已分配的字符与语义不再改变。
- Convertibility:Unicode 与其他著名字符集可以精确转换。
2.1.2 Unicode联盟
http://www.unicode.org/
https://en.wikipedia.org/wiki/Unicode_Consortium
https://zh.wikipedia.org/wiki/統一碼聯盟
Unicode协会(Unicode的公司)是一个非营利组织。它的主要目的是维护和发布Unicode标准,因为现存编码不能够在多语言电脑环境中使用,而且字符数有局限。
Unicode联盟有来自多个国家政府和各大软件商的代表参与。
Unicode联盟积极与各标准制订机构合作,包括国际标准化组织(ISO)、国际电工委员会(IEC)、万维网联盟(W3C)、互联网工程工作小组(IETF)和欧洲计算机制造协会(ECMA)等。
投票成员包括对文本处理标准感兴趣的计算机软件和硬件公司,包括Adobe,Apple Inc.,Berkeley,Emojipedia,Facebook,Google,华为,IBM,Microsoft,Monotype,Oracle Corporation,Yahoo!。和SAP SE。与Unicode标准相关的技术决定由Unicode技术委员会(UTC)做出。
2.2 UCS 通用编码字符集
https://en.wikipedia.org/wiki/Universal_Coded_Character_Set
https://zh.wikipedia.org/wiki/通用字符集
通用字符集(英语:Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。
2.3 Unicode vs UCS (ISO 10646)
https://zh.wikipedia.org/wiki/通用字符集#Unicode和ISO_10646的关系
https://en.wikipedia.org/wiki/Universal_Coded_Character_Set#Relationship_with_Unicode
历史上存在两个独立的尝试创立单一字符集的组织,因此最初制定了不同的标准。
- 国际标准化组织(ISO)于1984年创建的ISO/IEC 制定标准(ISO 10646);
- 由Xerox、Apple等软件制造商于1988年组成的统一码联盟 制定标准(Unicode)。
1991年前后,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。
从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。
两个项目仍都独立存在,并独立地公布各自的标准。但统一码联盟和ISO/IEC JTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。
在发布的时候,Unicode一般都会采用有关字码最常见的字体,但ISO 10646一般都尽可能采用Century字体。
ISO/IEC 10646-1:1993 = Unicode 1.1 (1993)
...
ISO/IEC 10646:2017 = Unicode 12.0 (2019.05)
https://zh.wikipedia.org/wiki/通用字符集#Unicode和ISO_10646的异同
https://en.wikipedia.org/wiki/Universal_Coded_Character_Set#Differences_from_Unicode
- 在两个标准里,所有的字符都在相同的位置并且有相同的名字,并会同步增修。
- ISO/IEC 10646标准,就像ISO/IEC 8859标准一样,只是一个简单的字符集表。它定义了一些编码的别名,指定了一些与标准有关的术语,并包括了规范说明,指定了怎样使用UCS连接其他ISO标准的实现,比如ISO/IEC 6429和ISO/IEC 2022。还有一些与ISO紧密相关的,比如ISO/IEC 14651是关于UCS字符串排序的。
- Unicode标准,额外定义了许多与字符有关的语义符号学。Unicode详细说明了绘制某些语言(如阿拉伯语)表达形式的算法,处理双向文字(比如拉丁文和希伯来文的混合文字)的算法,排序与字符串比较所需的算法,等等。
- Unicode使用更加广泛,因其具有更多的属性。
3. 字符编码
https://en.wikipedia.org/wiki/Character_encoding
https://zh.wikipedia.org/wiki/字符编码
字符编码(英语:Character encoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。
3.1 现代编码模型
https://zh.wikipedia.org/wiki/字符编码#现代编码模型
https://en.wikipedia.org/wiki/Character_encoding#Unicode_encoding_model
- 抽象字符表(Abstract character repertoire)是一个系统支持的所有抽象字符的集合。字符表可以是封闭的,即除非创建一个新的标准(ASCII和多数ISO/IEC 8859系列都是这样的例子),否则不允许添加新的符号;字符表也可以是开放的,即允许添加新的符号(统一码和一定程度上代码页是这方面的例子)。
- 编码字符集(CCS:Coded Character Set)是将字符集C中每个字符映射到1个坐标(整数值对:x, y)或者表示为1个非负整数N。字符集及码位映射称为编码字符集。例如,在一个给定的字符表中,表示大写拉丁字母“A”的字符被赋予整数65、字符“B”是66,如此继续下去。
- 字符编码表(CEF:Character Encoding Form),也称为"storage format",是将编码字符集的非负整数值(即抽象的码位)转换成有限比特长度的整型值(称为码元code units)的序列。这对于定长编码来说是个到自身的映射(null mapping),但对于变长编码来说,该映射比较复杂,把一些码位映射到一个码元,把另外一些码位映射到由多个码元组成的序列。
- 字符编码方案(CES:Character Encoding Scheme),也称作"serialization format"。将定长的整型值(即码元)映射到8位字节序列,以便编码后的数据的文件存储或网络传输。在使用Unicode的场合,使用一个简单的字符来指定字节顺序是大端序或者小端序(但对于UTF-8来说并不需要专门指明字节序)。
- 传输编码语法(transfer encoding syntax),用于处理上一层次的字符编码方案提供的字节序列。一般其功能包括两种:一是把字节序列的值映射到一套更受限制的值域内,以满足传输环境的限制,例如Email传输时Base64或者quoted-printable,都是把8位的字节编码为7位长的数据;另一是压缩字节序列的值,如LZW或者行程长度编码等无损压缩技术。
3.2 字符转换工具
https://zh.wikipedia.org/wiki/字符编码#字符转换工具
https://en.wikipedia.org/wiki/Character_encoding#Character_encoding_translation
Cross-platform | Web browsers | 大多数现代Web浏览器均具有自动字符编码检测功能。 一般是在菜单"查看"(View)/"字符编码"(Character Encoding) |
International Components For Unicode |
一套C语言与Java语言的开源库,由IBM提供,用于Unicode等多语言编码的转换、实现。可从ICU4C使用uconv。 | |
iconv | 程序与编程API,用于字符编码转换 | |
convert_encoding.py | 基于Python的实用程序,用于在任意编码和行尾之间转换文本文件。 | |
decodeh.py | 用于启发性猜测编码方案的算法与模块. | |
luit | 将输入和输出的编码转换为交互运行的程序的程序 | |
file | 新版本的Unix命令File做字符编码的检测.(cygwin与mac都有此命令) | |
chardet | Mozilla的编码自动检测代码的Python语言实现. | |
charset | 具有简单接口的C++模板库,可在C++/用户定义的流之间进行转换。 Charset定义了许多字符集,并允许您使用支持endianness的 Unicode格式。 |
|
Linux | cmv | 用于文件名转码的简单工具。 |
convmv | 将文件名从一种编码转换为另一种。 | |
cstocs | 将捷克语和斯洛伐克语的文件内容从一种编码转换为另一种编码。 | |
recode | 将文件内容从一种编码转换为另一种 | |
utrac | 将文件内容从一种编码转换为另一种编码。 | |
enca | 分析给定文本文件的编码。 | |
Windows | enca | 分析编码方法 |
Encoding.Convert | .NET API | |
cscvt | 转换工具 | |
MultiByteToWideChar /WideCharToMultiByte |
Windows API 从ANSI转换为Unicode和从Unicode转换为ANSI |
3.3 Unicode的具体实现
映射和编码
https://en.wikipedia.org/wiki/Unicode#Mapping_and_encodings
Unicode转换格式和通用编码字符集
https://en.wikipedia.org/wiki/Unicode#Unicode_Transformation_Format_and_Universal_Coded_Character_Set
Unicode定义了两种映射方法:Unicode转换格式(UTF)编码和通用编码字符集(UCS)编码。UCS-2是UTF-16的过时子集;UCS-4和UTF-32在功能上是等效的。
https://zh.wikipedia.org/wiki/Unicode#Unicode_的编码和实现
大概来说,Unicode 编码系统可分为编码方式和实现方式两个层次。
Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。
Unicode 的实现方式称为 Unicode转换格式(Unicode/UCS Transformation Format,简称为 UTF),即把Unicode字符转换为某种格式之意。Unicode可以通过不同的字符编码实现。
常见的有:
- UTF-8 ,一个8位的可变宽度编码最大化兼容性ASCII ; FreeBSD和最新的Linux发行版使用它来直接替代常规文本处理中的旧式编码。前128个Unicode代码点表示ASCII字符,这意味着任何ASCII文本也是UTF-8文本。(www 95%, Linux) https://en.wikipedia.org/wiki/UTF-8 https://zh.wikipedia.org/wiki/UTF-8
- UTF-16,一种16位可变宽度编码;(Windows) https://en.wikipedia.org/wiki/UTF-16 https://zh.wikipedia.org/wiki/UTF-16
- GB18030,GB18030在中国已标准化,并且完全实现了Unicode,而不是正式的Unicode标准。 (中国) https://en.wikipedia.org/wiki/GB_18030 https://zh.wikipedia.org/wiki/GB_18030
其他还有:
- UTF-EBCDIC,类似于UTF-8的8位可变宽度编码,但旨在与EBCDIC兼容(不是Unicode标准的一部分);
- UTF-32,一种32位固定宽度编码。(也称为UCS-4)为每个字符使用四个字节。与UCS-2一样,每个字符的字节数是固定的,从而有助于字符索引。但是与UCS-2不同,UTF-32能够编码所有Unicode代码点。但是,由于每个字符使用四个字节,因此UTF-32比其他编码占用更多的空间,因此并未得到广泛使用。https://en.wikipedia.org/wiki/UTF-32
- 已过时的有: UTF-1,UTF-7等...
3.4 Unicode编码比较
https://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings
八位环境
代码范围(十六进制) | 转换为十进制 HEX2DEC(A2) |
区间 容量 |
UTF-8 | UTF-16 | UTF-32 | UTF-EBCDIC | GB 18030 | ||||
000000 | - | 00007F | 0 | - | 127 | 127 | 1 | 2 | 4 | 1 | 1 |
000080 | - | 00009F | 128 | - | 159 | 31 | 2 | 2 继承GB 2312/GBK (例如多数汉字) 4 是其他所有字符。 |
|||
0000A0 | - | 0003FF | 160 | - | 1023 | 863 | 2 | ||||
000400 | - | 0007FF | 1024 | - | 2047 | 1023 | 3 | ||||
000800 | - | 003FFF | 2048 | - | 16383 | 14335 | 3 | ||||
004000 | - | 00FFFF | 16384 | - | 65535 | 49151 | 4 | ||||
010000 | - | 03FFFF | 65536 | - | 262143 | 196607 | 4 | 4 | 4 | ||
040000 | - | 10FFFF | 262144 | - | 1114111 | 851967 | 5 |
4. 更多相关wiki链接
字体列表
https://en.wikipedia.org/wiki/List_of_typefaces#Unicode_fonts
开源Unicode字体
https://en.wikipedia.org/wiki/Open-source_Unicode_typefaces
比较
https://en.wikipedia.org/wiki/Open-source_Unicode_typefaces#Comparison
https://en.wikipedia.org/wiki/GB_2312
汉字编码
https://en.wikipedia.org/wiki/Chinese_character_encoding
中国文字
https://en.wikipedia.org/wiki/Chinese_characters
5.5繁体中文,简体中文和日语的比较
中日韩字符
https://en.wikipedia.org/wiki/CJK_characters
国际化中,CJK是中文,日文和韩文语言的统称,它们的书写系统中都包含汉字和派生词(统称CJK字符),有时还与其他脚本配对。
有时会包含越南语,因此缩写为CJKV,因为越南历史上也使用汉字。总的来说,CJKV人物通常包括汉字在中国,汉字,假名在日本,汉字,韩文在韩国和干旱自我或喃在越南。
https://en.wikipedia.org/wiki/Unicode_font
Unicode原则上与字体本身无关,将字体视为实现选择。
任何给定的角色都可能有许多变种,从更常见的粗体,斜体和基本字母形式到复杂的装饰风格。如果可以使用Unicode标准中定义的代码点访问字体中的字形,则该字体为“ Unicode兼容”。
由于TrueType和OpenType支持Unicode ,因此广泛使用基于Unicode的免费和零售字体。这些字体格式将Unicode代码点映射到字形,但是TrueType字体限制为65,535个字形。
Utility software 实用程序软件
https://en.wikipedia.org/wiki/Unicode_font#Application_of_Unicode_fonts
这是一些可以识别字体文件中存在的字符的实用程序软件的选择:
Character Map 字符映射表,Microsoft Windows附带的小程序 https://en.wikipedia.org/wiki/Character_Map_(Windows)
Font Book,Mac OS附带的应用程序 https://en.wikipedia.org/wiki/Font_Book
GNOME Character Map GNOME字符映射表,GNOME桌面环境随附的应用程序 https://en.wikipedia.org/wiki/GNOME_Character_Map
BabelMap,用于Windows的第三方软件 https://en.wikipedia.org/wiki/GNOME_Character_Map
字体管理软件
https://en.wikipedia.org/wiki/Font_management_software
https://en.wikipedia.org/wiki/TrueType
TrueType字体是一种轮廓字体 标准由开发苹果在80年代末期作为竞争对手的Adobe的Type 1字体中使用的PostScript。
它已成为经典Mac OS,macOS和Microsoft Windows操作系统上最常见的字体格式。
TrueType的主要优点最初是为字体开发人员提供了高度控制权,可以精确控制各种字体大小的字体的显示方式,直至特定像素。
由于当今使用的渲染技术千差万别,因此TrueType字体不再能够确定像素级别的控制。
https://en.wikipedia.org/wiki/OpenType
OpenType是可缩放计算机字体的格式。它建立在其前身TrueType的基础上,保留了TrueType的基本结构,并添加了许多复杂的数据结构来规定印刷行为。
OpenType是Microsoft Corporation的注册商标。
该规范在Microsoft萌发,在1996年公开发布之时Adobe系统也做出了贡献。
由于具有广泛的可用性和印刷灵活性,包括处理世界上所有书写系统的各种行为的规定,因此OpenType字体通常在主要的计算机平台上使用。
https://en.wikipedia.org/wiki/List_of_input_methods_for_Unix_platforms
Unix平台的输入法列表
5. 补充: 字符集检测
内容嗅探
https://en.wikipedia.org/wiki/Content_sniffing
内容嗅探(也称为媒体类型嗅探或MIME嗅探)是一种检查字节流的内容以尝试推断其中数据的文件格式的实践。内容嗅探通常用于补偿缺少准确的元数据,否则将需要正确的元数据才能正确解释文件。内容嗅探技术倾向于使用多种技术的混合物,这些技术依赖于大多数文件格式中的冗余:寻找文件签名和幻数,以及启发式包括搜索著名的代表性子字符串,使用字节频率和n- gram表以及贝叶斯推断。
https://en.wikipedia.org/wiki/Browser_sniffing
字符集检测
https://en.wikipedia.org/wiki/Charset_detection
https://en.wikipedia.org/wiki/International_Components_for_Unicode
Unicode的国际组件 -一个可以执行字符集检测的库。
6. 更多参考
Unicode 和 UTF-8 有什么区别?
https://www.zhihu.com/question/23374078
- Unicode 字符集: 为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
- UTF-8 编码规则: 将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
字符编码笔记:ASCII,Unicode 和 UTF-8
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
UTF-8 的编码规则很简单,只有二条:
- 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
- 2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
英文: awesome-unicode
https://eng.getwisdom.io/awesome-unicode/
Unicode标准定义了当今所有主要语言中使用的字符代码。文字包括欧洲字母文字,中东从右到左文字以及许多亚洲文字。
Unicode标准还包括标点符号,变音符号,数学符号,技术符号,箭头,装饰符号,表情符号等。
很棒的软件包和库
https://eng.getwisdom.io/awesome-unicode/#awesomepackageslibraries
Unicode标准的原则
https://eng.getwisdom.io/awesome-unicode/#principlesoftheunicodestandard
About the Unicode Character Database
https://www.unicode.org/ucd/
https://dumps.codepoints.net/
语言工具
https://en.wikipedia.org/wiki/LanguageTool
LanguageTool是一个免费的开源 语法检查器,其所有功能都可以下载。
https://languagetool.org/