charsets - 程序员对字符集和国际化的观点
描述
Linux 是一个国际性的操作系统。它的各种各样实用程序和设备驱动程序 (包括控制台驱动程序 ) 支持多种语言的字符集,包括带有附加符号的拉丁字母表字符,重音符,连字(字母结合), 和全部非拉丁文字母表(包括希腊语,古代斯拉夫语,阿拉伯语,和希伯来语。 )
这份手册以程序员的眼光去看待不同的字符集标准,以及它们是如何在 Linux 中调和在一起的。讨论的标准包括 ASCII,ISO 8859,KOI8-R , Unicode,ISO 2022 和 ISO 4873 。
ASCII
ASCII (,美国国家信息交换(用)标准(代)码) 是最初的 7-bit字符集, 原先是为美式英语设计的。当前它被 ECMA-6 标准所描述。
在英国使用一种 ASCII的变体(这变体是:用英国磅值的符号代替美国的 crosshatch/octothorpe/hash 的磅值符号);当需要时,美国的(符号)和英国的变体(符号)可以用"US ASCII"和"UK ASCII" 作为区别。
因为 Linux 是为美国设计的硬件写的, 它生来就支持 US ASCII 。
ISO 8859
ISO 8859 是一系列 10 8-bit 字符集,它包含美国 ASCII 的低位 (7 -bit ), 128 ~159 范围内的不可见控制字符,和 96 个定宽图形(字符)在 160-255 里。。LP 这些字符集中,最重要是 ISO 8859-1 ( Latin-1 )。它生来就被 Linux 控制台驱动程序支持, X11R6 的支持得也很好,并且是 HTML 的基础字符集。
Linux 下控制台也支持其他的 8859 字符集,通过用户模式实用程序( 例如 setfont(8)) 来修改键盘绑定和 EGA 图形表格,以及进行控制台驱动程序里的字体表格中的“user mapping(用户影射)”。
下面是每个集合简短的描述:
- 8859-1 (Latin-1)
- Latin-1 覆盖大多数的西欧语言,比如阿尔巴尼亚, 加泰罗尼亚语, 丹麦, 荷兰,英语,法罗群岛,芬兰,法语,德语,加利西亚,爱尔兰,冰岛, 意大利,挪威,葡萄牙,西班牙和瑞典。缺少荷兰的 ij连字(i与j合字) ,法国的 oe(o与e合字)和旧风格的',,' 而德语中``(这样的)引号是可以的。
- 8859-2 (Latin-2)
- Latin-2 支持大多数的拉丁文书写的斯拉夫语和中欧的语言:克罗地亚 , 捷克语, 德语, 匈牙利, 波兰,罗马尼亚,斯洛伐克,和斯洛文尼亚。
- 8859-3 (Latin-3)
- Latin-3 是世界语,加里西亚 , 马耳他人, 和土耳其语作者受欢迎的(语言)。
- 8859-4 (Latin-4)
- Latin-4 介绍了爱沙尼亚语,拉托维亚,和立陶宛的字符 。它是实质上过时的; 参见 8859-10 (Latin-6 ) 。
- 8859-5
- 古代斯拉夫语字母支持保加利亚语, 白俄罗斯语,马其顿语, 俄语, 塞尔维亚语和乌克兰语。乌克兰人读带有下挑笔的`geh'为`heh',和(当)需要用带有上挑笔的 ghe 写正确的ghe.参见下面的(关于)KOI8-R 的讨论。(译注:这些外国人书写习惯我们也不怎么需要理解吧,希望上面的解释不要把人搞糊涂了)
- 8859-6
- 支持阿拉伯语。 8859-6 字型表是分离字符格式的一种固定的字体,但是一个合适的显示引擎应该联合这些来使用合适的词首,中间字母,和最后表格式。
- 8859-7
- 支持现代的希腊语。
- 8859-8
- 支持希伯来语。
- 8859-9 (Latin-5)
- 这是Latin-1 的一种变体,它用土耳其语的一些(字符)代替很少用的冰岛语。
- 8859-10 (Latin-6)
- Latin 6 增加末因纽特(译:对于last Inuit 我不知道是否是对的) (格陵兰语) 和 Sami ( 拉普兰语 ) ,这些是 Lattin 4 中缺少的,来覆盖整个北欧地区(的字符集)。 RFC 1345 列出了初步的和不同的“ latin 6 "。 Skolt Sami 仍然比这些需要更多的重音符号。
- 8859-13 (Latin-7)
- 8859-14 (Latin-8)
- 8859-15
- 增加了欧洲符号和法国连字,它们是 Latin-1 里缺漏的。
KOI8-R
KOI8-R 是在俄国流行的一个非 ISO 字符集。下半部分是 US ASCII; 上部是比 ISO 8859-5 设计的更好的古斯拉夫字符集。
控制台为了支持 KOI8-R 字符集,在 Linux 下,可以利用用户模式实用程序修改键盘绑定和 EGA 图形表格,以及在控制台的驱动程序中使用字体表“user mapping(用户映射)”。
UNICODE(统[单]一代码,宽[双]字节字符集)
Unicode( ISO 10646 ) 是一个标准,它的目标是明白地表现在每种人类语言中的每种已知字符。Unicode 的编码是 32 位的 ( 旧些的版本使用了 16 位 ) 。在 Unicode 的一些信息可以在<http://www.unicode.com>获得。
Linux 使用8位的 Unicode 转移格式 (UTF-8 ) 表示 Unicode 。 UTF-8 是可变长的 Unicode 编码。使用1个字节给 7 bit 编码,使用2个字节给 11 bit 编码,使用3个字节给 16 bit 编码,使用4个字节给 21 bit 编码,使用5个字节给26 bit 编码,使用6个字节给 31 bit 编码
让 0,1 , x 代表零,一,或任意的位。字节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-bit ISO 10646 编码,那么这个级数就会延伸到 6 字节编码)
对于 ISO-8859-1 的用户而言,这意味着带高位的字符编码成两个字节。这会令普通的文本文件增大1到2个百分点。不过没有变换问题, 因为 Unicode ISO-8859-1 符号的值等于他们的 ISO-8859-1 值 (用 8 个前导零做前缀) 。对于日语的用户,这意味着原来常用的 16 位编码将占 3 个字节,并且还要求有扩展的映射表。许多日本人因此比较喜欢 ISO 2022 。
注意 UTF-8 是自我同步的: 10xxxxxx 是一条尾巴, 任何其它的字节是编码的头。ASCII 字节出现在 UTF-8 流中唯一的可能是作为自己出现。特别是, 不会有 NULs 或 " /'s 嵌入在那些比较大的编码中。
因为编码中的 ASCII,特别是, NUL 和'/', 没有变化, 所以内核不会注意到在使用 UTF-8。它根本不在乎它正在处理的那字节代表什么东西。
Unicode 数据流的呈现通常是通过" subfont "表来操作,这个表是 Unicode 的一个子集到字符表格的映射。内核内部使用 Unicode 描述装载入显示内存的 subfont。这意味着在 UTF-8 中的一个模式能使用 512 个不同的符号。这对于日语,汉语和朝鲜语来说是不够的,但是它满足了大多数其它用途。
ISO 2022 AND ISO 4873
ISO 2022 和 4873 标准描述了一个基于 VT100 实现的字体控制模型. Linux 内核和 xterm (1) ( 部分 ) 支持这个模型。它在日本和韩国很流行。
它有 4 个图形的字符集,称为 G0 , G1 , G2 和 G3 ,并且其中之一是当前的高位为0 的编码的字符集(最初 G0 ),而他们之一是当前的高位为1的编码的字符集(最初 G1 )。每种图形的字符集有 94 或 96 个字符 ,并且是实际上是一个 7-bit字符集。它使用 040-0177 ( 041-0176 ) 或 0240-0377 ( 0241-0376 )编码中的一个。G0 大小总是为 94,并且使用 041-0176 之间的编码。
字符之间切换用转换(shift functions)功能 ^N (SO 或 LS1), ^O (SI 或 LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). LSn 把字符集Gn标记为当前字符集,用于高位为0的编码。 LSnR 把字符集 Gn标记为当前字符集,用于高位为1的编码。 SSn 把字符集Gn (n=2 or 3) 标记为当前字符集,只用于下一个字符(不管它的高位的值是什么)
94 字符的集合用做 Gn字符集是用一个逃逸序列 ESC ( xx (用于 G0),ESC ) xx (用于 G1), ESC * xx (用于 G2),ESC + xx (用于 G3),等代表的.这里的 xx 是一个符号或者是在 ISO 2375 国际注册编码字符集中的一对符号。例如,ESC ( @ 选用 ISO 646 字符集作为GO, ESC ( A 选用 UK 标准字符集(用磅代替数字记号), ESC ( B 选择 ASCII ( 用美元代替流通货币), ESC ( M 为非洲语言选择一个字符集, ESC ( ! A 选择古巴字符集, 等等. 等等.
94 字符的集合用做 Gn字符集是用一个逃逸序列 ESC - xx (对于 G1), ESC . xx (对于 G2)或 ESC / xx (对于 G3)等表示.例如, ESC - G 选择希伯莱字母表作为 G1.
多字节的字符集用做 Gn 字符集是用一个逃逸序列 ESC $ xx 或者 ESC $ ( xx (对于 G0), ESC $ ) xx (对于 G1),ESC $ * xx (对于 G2),ESC $ + xx (对于 G3)等来表示.例如, ESC $ ( C 为 G0选择韩国字符集. 日本字符集合由 ESC $ B选择更多临近的版本由ESC & @ ESC $ B选择.
ISO 4873 规定了一个范围比较窄的使用字符集,它的 G0是固定的 (总是 ASCII), 所以 G1, G2 和 G3只能被调用于高次序位编码集。尤其是,不再使用 ^N 和 ^O,ESC ( xx 仅用于 xx=B, 和 ESC ) xx, ESC * xx, ESC + xx 分别等价于 ESC - xx, ESC . xx, ESC / xx.
charsets - 程序员对字符集和国际化的观点的更多相关文章
- 不懂前端的程序员不是好美工——UI框架metronic使用教程——程序员视角
本着不懂前端的程序员不是好美工的观点,所以作为一个仅懂一点前端的程序员,为了成为一个好美工,所以只能用些取巧的方法伪装一下. metronic一个基于bootstrap的响应式的后台管理平台的UI框架 ...
- 对于长沙互联网发展,一个外来两年Java程序员的所见所感所愿
惟楚有材,于斯为盛 本文有感于2019长沙互联网求职招聘大会,内容比较多,但都是我自己的一些所见.所感和所愿. 2019年3月的最后一天,参加2019长沙互联网求职招聘大会,看到了很多的招聘企业,也看 ...
- 一年java程序员的感悟
前沿 在小公司干了差不多一年,刚进来与一个中级程序员做交接,过了大概一个月,那个中级程序员走了,从此,走上了"泥泞"的道路(独立开发),熟悉了公司的项目和业务用了一个月左右,公司当 ...
- 一个老程序员PHP程序员说的话(用来提醒自己)
我,一个老程序员,也是一个学生,把玩过甚多语言,大多不精.我既非名牌学校,也不是高学历,仅代表一部分比较蛋疼的人.接触PHP也是很早了,从04年的OFSTAR开始的,到现在六年了,期间也接触过不少的语 ...
- 关于Unicode,字符集,字符编码,每个程序员都应该知道的事
关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...
- 确定字符互异 牛客网 程序员面试金典 C++ Python
确定字符互异 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniStri ...
- 转:字符集和字符编码(Charset & Encoding)
转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创 ...
- [转载]一个标准java程序员的进阶过程
第一阶段:Java程序员 技术名称 内 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...
- [转]C/C++ 程序员必须收藏的资源大全
from: https://github.com/jobbole/awesome-cpp-cn C++ 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome – XXX 系列 ...
随机推荐
- zabbix 监控ssdb
zabbix 的啥基础知识啥的,请看由本站大牛凉白开先生写的zabbix教程.这里说说如何监控ssdb.SSDB 是一个 C/C++ 语言开发的高性能 NoSQL 数据库, 支持 KV, list, ...
- Logistic回归 线性回归(转)
来源: http://www.cnblogs.com/jerrylead 1 摘要 本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识.前四节主要讲述了回归问题,回归属于有监督学习 ...
- Windows JDK 1.8降级为1.7方法
转自:https://www.aliyun.com/jiaocheng/890626.html 正常情况下,JDK的升降级只需更改环境变量即可 可是到了1.8版本,Oracle使了一点小手段, 在系统 ...
- ArcGIS for JavaScript 3.9 本机IIS部署
arcgis 官方网站经常会打不开,天朝人民都懂得!因此将arcgis for javascript 配置到本机访问 首先esri中国下载最新版3.9的API: http://support.esri ...
- 【WIP】Objective-C Foundation框架的主要对象
创建: 2018/02/02 完成字符串: 2018/02/05 任务表: TODO 最新内容确认: 字符串,数据类, 数组类 可变与不变的对象 一览 种类 不变类 可变类 数组 NSA ...
- Codeforces Round #386 (Div. 2)G. New Roads [构造][树]
题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...
- StretchedBillboard 实现
参考Unity粒子系统的StretchedBillboard,在保持模型的右朝向不变的情况下,尽量朝向摄像机 转化为数学问题: 一个向量在一个面上的投影 基础的Billboard的方向应为: 从中点指 ...
- bzoj 1997: [Hnoi2010]Planar【瞎搞+黑白染色】
脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 ...
- 51nod 1244 莫比乌斯函数之和 【莫比乌斯函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \ ...
- ssh 公钥登录远程主机 并禁止密码登录
https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-centos7 如果在新的机器上,得先用密码登录一 ...