CHARSETS - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-08-13
名称
字符集——字符集标准和国际化
说明
本手册概述了不同的字符集标准,以及在Unicode变得无处不在之前它们是如何在Linux上使用的。其中一些信息对于使用遗留系统和文档的人仍然很有帮助。
讨论的标准包括ASCII、GB 2312、ISO 8859、JIS、KOI8-R、KS和Unicode。
主要强调的是语言环境字符集实际使用的字符集,而不是在其他系统的数据中可以找到的无数其他字符集。
ASCII
ASCII(美国信息交换标准代码)是最初为美式英语设计的7位字符集。也称为US-ASCII。它目前由ISO 646:1991 IRV(国际参考版本)标准描述。
出现了各种ASCII变体,将美元符号替换为其他货币符号,并将标点替换为非英语字母字符,以涵盖德语、法语、西班牙语和其他7位字符。都是弃用;glibc不支持字符集不是ASCII真正超集的locale。
由于Unicode在使用UTF-8时是与ASCII兼容的,因此纯ASCII文本在使用现代UTF-8时仍然可以正确地呈现。
ISO 8859
ISO 8859是一个由15个8位字符集组成的系列,所有这些字符集都有ASCII的低(7位)一半,不可见的控制字符在128到159的位置,96个固定宽度的图形在160到255的位置。
其中最重要的是ISO 8859-1("拉丁字母1"/ Latin-1)。它被不同的系统广泛采用和支持,并逐渐被Unicode所取代。ISO 8859-1字符也是Unicode的前256个字符。
在Linux下,通过用户模式实用程序(如setfont(8))可以获得对其他8859字符集的控制台支持,这些实用程序可以修改键盘绑定和EGA图形表,并在控制台驱动程序中使用"用户映射"字体表。
以下是对每套产品的简要介绍:
- 8859-1 (Latin-1)
拉丁-1包括许多西欧语言,如阿尔巴尼亚语、巴斯克语、丹麦语、英语、法罗语、加利西亚语、冰岛语、爱尔兰语、意大利语、挪威语、葡萄牙语、西班牙语和瑞典语。没有结扎,荷兰的A键,法国的A键,老式的A键德国的A键引号被认为是可以容忍的。
- 8859-2 (Latin-2)
拉丁-2支持许多拉丁书写的中欧和东欧语言,如波斯尼亚语、克罗地亚语、捷克语、德语、匈牙利语、波兰语、斯洛伐克语和斯洛文尼亚语。取代罗马尼亚e # 153; / e # 155;英镑被认为是可以忍受的。
- 8859-3 (Latin-3)
拉丁语-3的目的是覆盖世界语、马耳他语和土耳其语,但8859-9后来取代了它,成为土耳其语。
- 8859-4 (Latin-4)
拉丁语-4引入了北欧语言如爱沙尼亚语、拉脱维亚语和立陶宛语,但被8859-10和8859-13所取代。
- 8859-5
支持保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语和(几乎全部)乌克兰语的西里尔字母。它从未被广泛使用,参见下面KOI8-R/KOI8-U的讨论。
- 8859-6
是为阿拉伯语创建的。8859-6字形表是单独字母形式的固定字体,但适当的显示引擎应该使用适当的首字母、中间字母和最终字母形式将它们组合起来。
- 8859-7
1987年为现代希腊语设计,2003年更新。
- 8859-8
支持现代希伯来语,没有niqud(标点符号)。Niqud和成熟的圣经希伯来语不在这个字符集的范围之内。
- 8859-9 (Latin-5)
这是拉丁语-1的变体,它将冰岛字母替换为土耳其字母。
- 8859-10 (Latin-6)
拉丁-6增加了拉丁-4中没有的因纽特人(格陵兰人)和萨米人(拉普人)字母,覆盖了整个北欧地区。
- 8859-11
支持泰国字母和几乎相同的TIS-620标准。
- 8859-12
此集合不存在。
- 8859-13 (Latin-7)
支持波罗的海沿岸语言;特别地,它包括了在拉丁-4中没有的拉脱维亚字符。
- 8859-14 (Latin-8)
这是凯尔特人的字符集,包括老爱尔兰语,曼恩语,盖尔语,威尔士语,康沃尔语和布雷顿语。
- 8859-15 (Latin-9)
拉丁-9与广泛使用的拉丁-1相似,但将一些不太常见的符号替换为欧元符号以及拉丁-1中缺失的法语和芬兰字母。
- 8859-16 (Latin-10)
这个集合涵盖了许多东南欧洲语言,最重要的是对罗马尼亚语的支持比拉丁-2语言更全面。
KOI8-R / KOI8-U
KOI8-R是在Unicode之前在俄罗斯流行的一种非iso字符集。下半部分是ASCII码;上部是一个西里尔字母字符集,比ISO 8859-5设计得更好。基于KOI8-R的KOI8-U对乌克兰有更好的支持。与ISO 8859系列不同,这两种设备都不兼容ISO-2022。
对KOI8-R的控制台支持可以在Linux下通过用户模式实用程序获得,这些实用程序修改键盘绑定和EGA图形表,并在控制台驱动程序中使用"用户映射"字体表。
GB 2312
GB 2312是中国大陆用于表示简体中文的国家标准字符集。就像JIS X 0208一样,字符被映射到用于构造eucc - cn的94x94双字节矩阵。cn是Linux中最重要的编码,包括ASCII和GB 2312。注意,cn通常称为GB、GB 2312或CN-GB。
Big5
Big5在台湾是一种很流行的表达繁体字的字符集。(Big5既是字符集也是一种编码。)它是ASCII码的超集。非ascii字符以两个字节表示。字节0xa1-0xfe用作双字节字符的前导字节。Big5及其扩展在台湾和香港广泛使用。它不符合ISO 2022。
JIS X 0208
JIS X 0208是日本国家标准字符集,虽然还有更多的日本国家标准字符集(如JIS X 0201、JIS X 0212和JIS X 0213),但这是最重要的一个。字符被映射到94x94双字节矩阵,其每个字节的范围是0x21-0x7e。注意,JIS X 0208是一个字符集,而不是一种编码。这意味着JIS X 0208本身不用于表示文本数据。JIS X 0208用作组件来构造编码,如EUC-JP、Shift_JIS和ISO-2022-JP。EUC-JP是Linux最重要的编码,包括ASCII和JIS X 0208。在EUC-JP中,JIS X 0208字符用两个字节表示,每个字节是JIS X 0208代码加0x80。
KS X 1001
KS X 1001是韩国国家标准字符集,就像JIS X 0208一样,字符被映射到一个94x94的双字节矩阵中。KS X 1001像JIS X 0208一样被用作构建编码的组件,如EUC-KR、Johab和ISO-2022-KR。EUC-KR是Linux中最重要的编码,包括ASCII和KS X 1001。KS c5601是KS X 1001的老名字。
ISO 2022 and ISO 4873
ISO 2022和4873标准描述了一个基于VT100实践的字体控制模型。Linux内核和xterm(1)(部分)支持这个模型。已经定义了一些基于ISO 2022的字符编码,特别是日语。
有4个图形字符集,分别称为G0、G1、G2和G3,其中一个是高0位编码的当前字符集(最初为G0),另一个是高1位编码的当前字符集(最初为G1)。每个图形字符集有94或96个字符,本质上是一个7位字符集。它使用代码040-0177(041-0176)或0240-0377(0241-0376)。G0的大小总是94,使用代码041-0176。
字符集之间的切换是通过移动函数haN (SO或LS1)、haO (SI或LS0)、ESC n (LS2)、ESC o (LS3)、ESC n (SS2)、ESC o (SS3)、ESC ti (LS1R)、ESC} (LS2R)、ESC | (LS3R)完成的。lsn函数使高比特为零的代码的字符集G n成为当前的字符集。lsnr函数使高位码的字符集G n成为当前的字符集。函数SS n使字符集G n (n=2或3)只作为下一个字符的当前字符集(不管它的高阶位的值是多少)。
94 -字符集被指定为G n字符集的转义序列ESC (xx (G0), ESC) xx (G1), ESC * xx (G2), ESC + xx (G3), xx是符号的符号或一对发现在ISO 2375国际注册的编码字符集。例如,ESC(@选择ISO 646字符集G0, ESC(选择英国标准字符集(英镑而不是数字符号),ESC (B选择ASCII(美元而不是货币符号),ESC (M选择非洲语言的字符集,ESC (!A选择古巴字符集,以此类推。
一个96个字符的字符集被一个转义序列ESC - xx(用于G1), ESC指定为gn字符集。xx (G2)或ESC / xx (G3)。例如,ESC - G选择希伯来字母为G1。
通过转义序列ESC $ xx或ESC $ (xx(用于G0), ESC $) xx(用于G1), ESC $ * xx(用于G2), ESC $ + xx(用于G3)指定一个多字节字符集为gn字符集。例如,ESC $ (C选择G0的韩语字符集。由ESC $ B选择的日文字符集有一个由ESC & @ ESC $ B选择的最新版本。
ISO 4873规定一个狭义的字符集,G0是固定的(总是ASCII), G1, G2和G3只能调用代码设置了高阶位。特别是,汉族和郝不习惯了,ESC (xx可以使用只有xx = B,和ESC) xx, ESC * xx, ESC + xx相当于ESC - xx, ESC。分别为xx, ESC / xx。
TIS-620
ti -620是泰国国家标准字符集,也是ASCII的超集。按照与ISO 8859系列相同的方式,泰国字符被映射到0xa1-0xfe中。
Unicode
Unicode (iso10646)是一种明确表示人类语言的每一个字符的标准。Unicode的结构允许20.1位对每个字符进行编码。由于大多数计算机不包括20.1位的整数,Unicode通常在内部被编码为32位整数和一系列16位整数(UTF-16)(仅在编码某些罕见字符时需要两个16位整数)或一系列8位字节(UTF-8)。
Linux使用8位Unicode转换格式(UTF-8)表示Unicode。UTF-8是Unicode的可变长度编码。它使用1字节编码7位,2字节编码11位,3字节编码16位,4字节编码21位,5字节编码26位,6字节编码31位。
让(0,1,x)代表一个(0,1)或任意位。字节0xxxxxxx表示Unicode 00000000 0xxxxxxx,它与ASCII 0xxxxxxx编码相同的符号。因此,ASCII不变地变成UTF-8,而且只使用ASCII的人不会注意到任何变化:代码和文件大小都不会发生变化。
一个字节110xxxxx是一个2字节代码的开始,110xxxxx 10yyyyyy被组装成00000xxx xxyyyyyy。字节1110xxxx是一个3字节代码的开始,1110xxxx 10yyyyyy 10zzzzzz被组装成xxxxyyyy yyzzzzzz。(当使用UTF-8编码31位的ISO 10646时,这一进程将继续到6字节代码。)
对于ISO 8859字符集中的大多数文本,这意味着ASCII之外的字符现在用两个字节编码。这往往只会将普通文本文件扩展1%或2%。对于俄语或希腊语文本,这将普通文本文件扩展100%,因为这些语言中的文本大多不在ASCII中。对于日本用户来说,这意味着现在常用的16位代码需要3个字节。虽然有从某些字符集(特别是ISO 8859-1)到Unicode的算法转换,但一般的转换需要携带转换表,对于16位代码来说,转换表可能相当大。
注意,UTF-8是自同步的:10xxxxxx是一个尾,其他任何字节都是代码的头。注意,ASCII字节在UTF-8流中出现的唯一方式就是它们本身。特别地,没有嵌入的NULs (aq
因为ASCII,特别是NUL和aq/aq没有改变,所以内核不会注意到使用了UTF-8。它根本不关心它所处理的字节代表什么。
aq)或aq/aqs,它们是一些更大的代码的一部分。
Unicode数据流的呈现通常通过将Unicode子集映射到字形的"子字体"表处理。内核内部使用Unicode来描述在视频RAM中加载的子字体。这意味着在UTF-8模式下的Linux控制台中,可以使用具有512个不同符号的字符集。对于日语、汉语和韩语来说,这还不够,但对于大多数其他用途来说已经足够了。
iconv (1), ascii (7), iso_8859-1 (7), unicode (7), utf-8 (7)
另外参见
[段落]
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。