如果您喜欢本文,请点此关注
(本文6160字,看完大概需要11分钟,理解需要……分钟)
最近,经常有师生询问与“本土化”相关的话题。 希望沙龙先生给大家分享一下。 出色地! 本土化的坑很深,正所谓“书山路难走,学海无涯。回头是岸”。 团友们要小心了!
不信,今天我就上一道小菜给大家体验一下。 然后说说本地化最基本的入门知识:字符集和字符编码。
为什么先讲字符集和字符编码呢? 因为要做本地化,首先要知道各个国家/地区的文字和符号在电脑上是如何存储和显示的。
为了帮助大家理解,我先举个例子。 假设我们使用的是中文版的Windows 10操作系统。 打开记事本程序,输入以下内容,保存:
这时会弹出一个警告页面。 你是什么意思? 即里面的内容不全是ANSI编码,还有Unicode格式。 忽略它,单击确定即可查看。
可怕! 立马打脸。 原来的版权符号©变成了问号。 看来警告信息不能忽略。
重新做一遍,这次选择“另存为”保存。
然后选择编码。 此时,会出现几个选项。 如何选择? 我们暂时选择UTF-8,这时候版权符号就可以正常保存了。 其他选项稍后解释。
如果您不会使用记事本,让我们试试文本编辑器 EmEditor。 在EmEditor中选择Save As,更改Encoding,会出现如下界面。
现在,你是不是对什么是字符和编码有了一点感觉? 现在我们进入正式的学习。
第 1 部分:基本概念
字节
字节是计算机用来衡量存储容量的计量单位。 我们知道,计算机只能识别由 1 和 0 组成的二进制位。一个数就是 1 位。 为了计算方便,规定8位为一个字节。
例如:10101010,8位二进制,占用一个字节的存储容量。
特点
字符与字节不同。 字符是各种字符和符号的总称,包括各个国家/地区的字符、数字、标点符号、图形符号等。 但是一个字符在计算机中占用多少字节与编码方式有关。 使用不同的编码方式占用不同的内存。
例如:符号加号+是一个字符,汉字“翻译”是两个字符。 GBK编码一个汉字占2个字节一个汉字占几个字节,UTF-8编码一个汉字占3个字节。
编码标准
本来,计算机只能显示0、1等二进制数,随着计算机进入寻常百姓家,人们当然希望能够在计算机上直接显示字符。 因此,国际组织制定了编码规范,希望用不同的二进制数来表示不同的字符,让计算机根据二进制数显示相应的字符。
例如:GBK编码规范允许计算机在二进制数和汉字之间进行转换。 使用GBK编码可以使计算机显示汉字。
字体表
一套编码标准不一定包含世界上所有的字符,每一套编码标准都有自己的适用场景。 字体表存储了某种编码规范下可以显示的所有字符。 计算机根据二进制数从字形表中找出对应的字符,然后显示给用户。 字体表相当于一个存储字符的数据库。
例如:几乎所有的汉字都存储在GBK编码标准的字形表中,所以可以显示汉字。 但是法文和俄文不在字库表中,所以用GBK编码的文档不能正常显示法文、俄文等不在字库表中的字符。
字符集
在字体表中,每个字符都有对应的二进制地址,字符集(Character Set)就是这些地址的集合。 字符集定义了字符与二进制的对应关系,并为每个字符分配了一个唯一的编号。 字符集可以理解为一张大表,列出了所有字符和二进制的对应关系,计算机显示文本或存储文本,就是一个查表的过程。
字符编码
由于计算机只能识别二进制数据,为了准确处理各种字符集,需要将字符数据转换为二进制数据。 字符编码规定了如何将字符流转换成字节流,以及如何在计算机中存储字符的个数。 如果使用像GB2312、GBK这样的变长存储方案(不同的字符占用不同的字节数),那么为了区分一个字符用了多少字节,不能直接在计算机中存储字符编号。 字符数在存储前必须进行转换,读取时必须反向转换一次。 这种转换方案称为字符编码。
字符集和字符编码的区别
在Unicode出现之前,字符集和字符编码的区别并不明显。 因为同一个字符集只有一种编码方式,比如ASCII,所以既可以指代字符集又可以指代字符编码。
Unicode字符集出现后,由于支持多种编码方式,开始区分两者。 Unicode下,字符集是指Unicode,字符编码是指UTF-8、UTF-16、UTF-32等。
这是一个简短的总结:
编码过程:字形表中的一个字符或符号在字符集中找到对应的二进制串,然后通过编码方法将其存储在计算机存储设备中。
译码过程:将一个二进制数通过编码方法转换成编码字符集中的正常地址,然后在字形表中找到对应的字符,最后显示给用户。
第二部分:通用字符编码规范
2.1 单字节字符集(Single-Byte Character Set,简称SBCS)
ASCII码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),是最早的编码规范,也是当今最常见的单字节编码系统,用于显示现代英语和其他西欧语言。
它使用7位(bits)二进制表示(00000000-01111111,即0x00-0x7F),可见ASCII码只需要1字节的存储空间。 没有具体的编码方式,直接用地址对应的二进制数来表示,或者干脆称之为ASCII编码方式。 共128个字符,字符值从0到127,其中32到126为可显示字符(英文大小写字符、阿拉伯数字和西文符号),其他为控制字符(回车、退格、换行) , ETC。)。
EASCII码
EASCII(Extended ASCII,ASCII扩展字符集),由于7位编码的字符集只能支持128个字符,为了表示更常用的字符,各个国家/地区和厂商都为自己定制了ASCII扩展字符集。 ASCII扩展字符集在标准ASCII的基础上,使用8位二进制(00000000-11111111,即0x00-0xFF)来表示一个字符,最多可支持256个字符。
ISO-8859
由于每个国家/地区和每个公司都有自己的扩展ASCII字符集,相同的数值在不同的字符集中可能有不同的符号。 这样,一个在一台电脑上可以正常读取的文件,在另一台电脑上就可能变成乱码了。
为了解决这个问题,国际标准化组织在ASCII的基础上进行了扩展,形成了ISO-8859标准。 类似于 EASCII,兼容 ASCII,区别在于前 128 个码位。
ISO-8859-1编码范围使用单个字节内的所有空间,在支持ISO-8859-1的系统中传输和存储过程中不会丢弃任何其他编码字节流。 换句话说一个汉字占几个字节,将任何其他编码字节流视为 ISO-8859-1 编码没有问题。 ASCII编码是7位容器,ISO-8859-1编码是8位容器。
可见ISO-8859-1只占1个字节,所以ISO-8859-1不支持中文。
ISO-8859标准不是一个字符集,而是一系列扩展的ASCII字符集。 由于欧洲语言环境复杂,根据各个地区的语言形成了很多子标准,如ISO-8859-1,ISO-8859-2,ISO-8859-3,…, ISO-8859-16。
详情如下:
ISO/IEC 8859-1 (Latin-1) – 西欧语言
ISO/IEC 8859-2 (Latin-2) – 中欧语言
ISO/IEC 8859-3 (Latin-3) – 南欧语言。 世界语也可以用这个字符集显示。
ISO/IEC 8859-4 (Latin-4) – 北欧语言
ISO/IEC 8859-5(西里尔文)- 西里尔文
ISO/IEC 8859-6(阿拉伯语)- 阿拉伯语
ISO/IEC 8859-7(希腊语)- 希腊语
ISO/IEC 8859-8(希伯来语)- 希伯来语(视觉顺序)
ISO 8859-8-I – 希伯来语(逻辑顺序)
ISO/IEC 8859-9(Latin-5 或土耳其语)——它取代了 Latin-1 冰岛语字母表并添加了土耳其语字母表。
ISO/IEC 8859-10(Latin-6 或 Nordic)——使用北日耳曼语言代替 Latin-4。
ISO/IEC 8859-11 (Thai) – 泰语,从泰国的 TIS620 标准字符集演变而来。
ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波罗的海语言
ISO/IEC 8859-14(Latin-8 或凯尔特语)- 凯尔特语
ISO/IEC 8859-15 (Latin-9) – 西欧语言,添加了 Latin-1 中缺失的芬兰语字母和大写法语重音字母,以及欧元 (€) 符号。
ISO/IEC 8859-16 (Latin-10) – 东南欧语言。 主要用于罗马尼亚语,并添加了欧元符号。
在我们的第一个示例中,EmEditor 显示了这些主要代码。
SBCS
上述ASCII、ASCII扩展字符集、ISO-8859中的每一个字符都可以用一个字节(8位)表示,所以称为单字节字符集(Single-Byte Character Set,简称SBC)。
2.2 双字节字符集(简称DBCS)
当计算机普及到中国、日本、韩国等亚洲国家时,字符数远远超过256个,单字节字符集的256个码点已经不能满足需求。 于是继续扩充二维表,单字节到双字节,16位二进制数,65536个码点。 不同国家/地区发展了自己的字符集,如中国大陆的GB2312、香港特别行政区和台湾的BIG5、日本的Shift JIS、韩国的Euc-kr等。
GB2312
GB2312是国家标准总局于1980年发布的一套国家标准,共收录6763个汉字和682个全角字符,包括拉丁字母、希腊字母、日文平假名和片假名字母、俄文西里尔字母. 特点。 GB2312的出现基本满足了计算机处理汉字的需要,它收录的汉字已经覆盖了中国大陆99.75%的使用频率。 但是GB2312无法处理人名、古汉语等出现的生僻字,这就导致了GBK和GB18030字符集的出现。
Big5
Big5又称大五或五大码,是台湾五大厂商宏基、申通、嘉嘉、灵逸、大众制定的繁体中文编码方案。 它是传统华人社区中最常用的。 计算机汉字集标准共收录汉字13060个。
GBK
GBK的全称是《汉字内码扩展规范》。 是在GB2312-80标准的基础上建立的内码扩展规范。 采用双字节编码方案,编码范围从8140到FEFE(不包括xx7F),共23940个码位,共包含21003个汉字,完全兼容GB2312-80标准,支持所有国际标准ISO/IEC 10646-1和国家标准GB13000-1中的中、日、韩汉字,包括BIG5编码的所有汉字。
GBK字符集中的所有字符,不管中文还是英文,都占2个字节。 没有特殊的编码方式,习惯上称之为GBK编码。 一般在中国,当汉字较多时使用。
GB18030
GB18030是中国政府于2000年3月17日发布的新的汉字编码国家标准。2001年8月31日以后在中国市场发布的软件必须符合该标准。 收录汉字27484个,涵盖汉、日、韩及中国少数民族文字。 满足中国大陆、香港特别行政区、台湾、日本、韩国等东亚地区信息交换多语言、大字符、多用途、统一编码格式的要求。
兼容Unicode 3.0版本,填充Unicode扩展字词表“统一汉字扩展A”的内容。 兼容历代国家字符编码标准(GB2312、GB13000.1)。
美标
在Windows系统中,ANSI编码就是本地编码。 起初,ANSI 最初只包含英文代码。 后来到了各个国家,就在ANSI编码的基础上扩展了各个国家的语言,所以ANSI编码也可以参考当地的编码。 也就是说,在简体中文Windows操作系统中,ANSI编码代表GBK编码; 在日文 Windows 操作系统中,ANSI 编码代表 Shift_JIS 编码。
2.3 多字节字符集(简称MBCS)
当互联网席卷全球,地域限制被打破,不同国家/地区的计算机在交换数据时,由于之前出现的各种编码方式,文本会出现乱码。
历史上,有两个独立的组织试图创建一个单一的字符集,即国际标准组织 (ISO) 和多语言软件制造商的 Unicode 联盟。 前者制定的ISO/IEC 10646项目是UCS字符集; 后者开发的Unicode项目就是最初的Unicode字符集。 所以这两个组织最初制定了不同的标准。
UCS(通用字符集)
通用字符集(Universal Character Set,简称UCS)是ISO制定的ISO 10646(或ISO/IEC 10646)标准定义的一种字符编码方式。 UCS 字符集包括所有其他字符集。 它保证与其他字符集的双向兼容性,即如果您将任何文本字符串转换为 UCS 格式,然后再转换回原始编码,您将不会丢失任何信息。 UCS 包含已知语言的所有字符。
Unicode 字符集
Unicode原始字符是由多语言软件厂商组成的Unicode Consortium开发的一套字符,包括世界上所有的字符和符号。 但在 1991 年左右,ISO 和 Unicode 联盟项目的参与者意识到世界不需要两个不兼容的字符集。 因此,他们开始合并他们的工作并共同创建一个代码表。
从Unicode 2.0开始,Unicode采用与ISO 10646-1相同的字库和字符编码; ISO也承诺ISO 10646不会给U+10FFFF以外的UCS-4编码赋值,这样两者是一致的。
目前这两个项目仍然存在并独立发布各自的标准。 但 Unicode 联盟和 ISO/IEC JTC1/SC2 都同意保持两个标准的代码表兼容,并密切合作以协调未来的任何扩展。 Unicode 在发布时一般使用相关编码最常用的字体,但 ISO 10646 一般尽可能使用 Century 字体。
任何文本在 Unicode 中都对应一个值,这个值称为代码点(code point)。 Unicode 标准在编写它们时始终使用十六进制数字和前缀“U+”。 比如字母“A”的编码是004116,那么“A”的编码就写成“U+0041”。
UCS-2, UCS-4
UCS对应两种编码:UCS-4,每个字符使用四个8位字节;UCS-2,每个字符使用两个8位字节。 UCS-2 和 UCS-4 定义了 Unicode 中文字和代码点之间的对应关系。
UCS-2用两个字节表示码位,取值范围为U+0000~U+FFFF。 比如“translation”的编码是U+7FFB,“translation”的编码是U+8BD1。
UCS-4 使用四个字节来表示代码点,可以表示更多的文本。 其范围为U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF与UCS-2相同。
UTF-8、UTF-16、UTF-32
Unicode 定义了全局文本的唯一编号,这是一个字符集。 TF是Transformation Format,意思是将Unicode转换成某种格式。 UTF-8、UTF-16、UTF-32是基于Unicode字符集的具体编码方式,也就是说,Unicode定义了一个由一串特定的二进制数字组成的字符,而UTF-8、UTF-16、 UTF-32 定义了如何将表示该字符的二进制数字符串存储到计算机中。
为什么 UTF-8、UTF-16 和 UTF-32 之间存在差异? 由于 Unicode 最多可以存储 4 个字节的字符。 也就是说,为了区分每个字符,每个字符的地址需要4个字节。 很明显,这是一种存储空间的浪费,所以就有了不同的编码方式,比如UTF-8、UTF-16、UTF-32编码。
UTF-8编码
UTF-8(8-bit Unicode Transformation Format)是Unicode的变长字符编码,以8位为单位对Unicode字符进行编码。
编码
如果只有一个字节,则其最高二进制位为0。如果为多字节,则第一个字节从最高位开始,连续二进制位值为1的个数决定了编码的字节数,而其余字节以 10 开头。
UTF-16 和 UTF-32
UTF-16 和 UTF-32 分别以 16 位和 32 位为单位对 Unicode 字符进行编码。
UTF-16编码在UCS-2的U+0000~U+FFFF范围内相当于UCS-2,UTF-32基本相当于UCS-4。
但是UCS-2和UCS-4只是编码方案,而UTF-16和UTF-32用于实际传输,所以我们不得不考虑字节顺序的问题。
字节顺序和 BOM
字节顺序
Little endian (LE):在起始地址存储低位字节;
Big endian (BE):在起始地址存储高位字节。
UTF-16 使用两个字节作为编码单元。 在解释一个 UTF-16 文本之前,您必须首先弄清楚每个编码单元的字节顺序。
物料清单
BOM(Byte Order Mark)是Unicode规范中推荐的一种标记字节顺序的方法。
UCS编码中有一个字符叫做“ZERO WIDTH NO-BREAK SPACE”,它的编码是FEFF。 而FFFE是UCS中不存在的字符,所以在实际传输中应该不会出现。 UCS规范建议我们在传输字节流之前先传输字符“ZERO WIDTH NO-BREAK SPACE”。
这样,如果接收方收到FEFF,说明这个字节流是Big-Endian的; 如果收到FFFE,说明字节流是Little-Endian。 因此,字符“ZERO WIDTH NO-BREAK SPACE”也称为BOM。
UTF-8不需要BOM来表示字节顺序,但是可以用BOM来表示编码。 字符“ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。 所以如果接收方收到一个以 EF BB BF 开头的字节流,它就知道它是 UTF-8 编码的。
结局:我的话
字符编码规范根据时代的发展和需要不断完善。 总的来说,大致可以分为三类:
1、ASCII表示的单字节码,如ASCII、ASCII扩展、ISO-8859下的序列码;
2、以GBK表示的双字节编码,如GB2312、GBK、GB18030等;
3、以Unicode为代表的统一编码体系,支持任何语言和字符,将字符编码值与编码方式分开。 一组编码值可以对应多组编码方式,如UTF-8、UTF-16、UTF-32等。
(本文部分内容引用自网络,原文出处不详,如涉及版权,请联系小编。)
今天的问题:
看完这篇关于“字符集”和“字符编码”的入门文章,你还想继续学习本地化吗? 想学习的,在留言区扣1。
平台:
翻译技术、计算机辅助翻译等课程在很多高校还处于探索阶段。 大家交流信息,交流信息是非常有必要的。 负责翻译技术和计算机辅助翻译教学的教师如有兴趣可加入微信交流群“翻译技术教学的设计与实现”。 (如果你是学生或商务人士,这个群可能不适合你,可以关注其他翻译技术应用交流群。)
群满了可以加小编微信邀请你进群。 加好友时,请明确说明身份和要加入哪个群,以便小编知道邀请哪个群比较合适。 不要简单地使用“添加组”这个词。