字符编码

From: http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81

字符编码Character encoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位元组或者电脉冲),以便文本计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码ASCII。其中,ASCII将字母、数字和其它符号编号,并用7位元二进制来表示这个整数。通常会额外使用一个扩充的位元,以便于以8位字节的方式存储。

在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。

目录

简单字符集

按照惯例,人们认为字符集和字符编码是同义词,因为使用同样的标准来定义提供什么字符并且这些字符如何编码到一系列的代码单元(通常一个字符一个单元)。由于历史的原因,MIME和使用这种编码的系统使用术语字符集来表示用于将一组字符编码成一系列八位字节数据的整个系统。

现代编码模型

统一码通用字符集所构成的现代字符编码模型则没有跟从简单字符集的观点。它们将字符编码的概念分为:有哪些字符、它们的编号、这些编号如何编码成一系列的“码元”(有限大小的数字)以及最后这些单元如何组成八位字节流。区分这些概念的核心思想是建立一个能够用不同方法来编码的一个通用字符集。为了正确地表示这个模型需要更多比“字符集”和“字符编码”更为精确的术语表示。现代模型中所用的术语列在下面:

字符表(Character repertoire)是一个系统支持的所有抽象字符的集合。字符表可以是封闭的,即除非创建一个新的标准(ASCII和多数ISO/IEC 8859系列都是这样的例子),否则不允许添加新的符号,;字符表也可以是开放的,即允许添加新的符号(统一码和一定程度上代码页是这方面的例子)。特定字符表中的字符反映了如何将书写系统分解成线性信息单元的决定。例如拉丁、希腊和斯拉夫字母表分为字母、数字、变音符号、标点和如空格这样的一些少数特殊字符,它们都能按照一种简单的线性序列排列(尽管对它们的处理需要另外的规则,如带有变音符号的字母这样的特定序列如何解释——但这不属于字符表的范畴)。为了方便起见,这样的字符表可以包括预先编号的字母和变音符号的组合。其它的书写系统,如阿拉伯语和希伯莱语,由于要适应双向文字和在不同情形下按照不同方式交叉在一起的字形,就使用更为复杂的符号表表示。

编码字符集(CCS:Coded Character Set)是将字符集C中每个字符映射到一个非负整数N(称作码位),这个字符集及码位映射称为编码字符集。例如,在一个给定的字符表中,表示大写拉丁字母“A”的字符被赋予整数65、字符“B”是66,如此继续下去。多个编码字符集可以表示同样的字符表,例如ISO-8859-1和IBM的代码页037和500含盖同样的字符表但是将字符映射为不同的整数。

字符编码表(CEF:Character Encoding Form)将编码字符集的非负整数值(即码位)转换成有限比特长度的整数值,以利于计算机系统使用固定比特长度的二进制形式表示该整数。例如,使用16比特长的存储单元保存数字信息,系统每个单元只能够直接表示从0到65,535的数值,但是如果使用多个16位单元就能够表示更大的整数。这就是CEF的作用,它可以把Unicode从0到140万的码空间范围的每个码位映射到单个或多个在0到65,5356范围内的码值。最简单的字符编码表就是单纯地选择足够大的单位,以保证编码字符集中的所有数值能够直接编码(一个码位对应一个码值)。这对于能够用使用八位元组来表示的编码字符集(如多数传统的非CJK的字符集编码)是合理的,对于能够使用十六位元来表示的编码字符集(如早期版本的Unicode)来说也足够合理。但是,随着编码字符集的大小增加(例如,现在的Unicode的字符集至少需要21位才能全部表示),这种直接表示法变得越来越没有效率,并且很难让现有计算机系统适应更大的码值。因此,许多使用新近版本Unicode的系统,或者将Unicode码位对应为可变长度的8位字节序列的UTF-8,或者将码位对应为可变长度的16位序列的UTF-16

字符编码方案(CES:Character Encoding Scheme)定义如何将定长的整数码对应到8位元组的序列,以便编码后的数据的文件存储或网络传输。在使用Unicode的场合,使用一个简单的字符来指定字节顺序是大端序或者小端序(但对于UTF-8来说并不需要专门指明字节序)。然而,有些复杂的字符编码机制使用转义序列在几种简单编码模式(如ISO/IEC 2022)和用于减小每个单元所用字节数的压缩机制(如SCSUBOCUPunycode)之间切换。

高层机制(higher level protocol)提供了额外信息,用于选择Unicode字符的特定变种,如XML属性 xml:lang

字符映射(character map)在Unicode中保持了其传统意义:从字符序列到编码后的字节序列的映射,包括了上述的CCS, CEF, CES层次。

字符集、代码页,与字符映射

术语字符编码(character encoding), 字符映射(character map), 字符集(character set)或者代码页,在历史上往往是同义概念, 即字符表(repertoire)中的字符如何编码为码元的流(stream of code units) – 通常每个字符对应单个码元。

码元(Code Unit,也称“代码单元”)是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,码元是8比特长;对于UTF-16来说,码元是16比特长;对于UTF-32来说,码元是32比特长[1]。码值(Code Value)是过时的用法。

代码页通常意味着面向字节的编码,但强调是一套用于不能语言的编码方案的集合. 著名的如"Windows"代码页系列,"IBM"/"DOS"代码页系列.

IBM的字符数据表示体系(Character Data Representation Architecture - CDRA)与编码字符集标识符(coded character set identifiers - CCSIDs) 常常把charset, character set, code page, or CHARMAP等类似意义的术语混用.

Unix或Linux不使用代码页概念,它们用charmap,比locales具有更广泛的含义.

与上文的编码字符集(Coded Character Set - CCS)不同,字符编码(character encoding)是从抽象字符到代码字(code word)的映射. HTTP(与MIME)的用法中,字符集(character set)与字符编码同义,但与CCS不是一个意思.

字符编码(不全)

西欧标准

  • ISO-8859-1
  • ISO-8859-5
  • ISO-8859-6
  • ISO-8859-7
  • ISO-8859-11
  • ISO-8859-15
  • ISO/IEC 646

DOS字符集(又称IBM代码页

Windows 字符集

亚洲字符集

中国大陆
港澳台
日本
朝鲜半岛
越南
印度
Unicode

字符转换工具

由于有很多种字符编码方法被使用,从一种字符编码转换到另一种,需要一些工具。

跨平台:

  • 网页浏览器 – 大多数现代的网页浏览器都具有此功能。一般是在菜单"查看"(View)/"字符编码"(Character Encoding)
  • iconv – 程序与编程API,用于字符编码转换
  • convert_encoding.py – 基于Python的转换工具.[2]
  • decodeh.py – 用于启发性猜测编码方案的算法与模块.[3]
  • International Components for Unicode – 一套C语言Java语言的开源库,由IBM提供,用于Unicode等多语言编码的转换、实现.
  • chardetMozilla的编码自动检测代码的Python语言实现.
  • 新版本的Unix命令File做字符编码的检测. (cygwinmac都有此命令)

Linux:

  • recode – [4]
  • utrac – 将整个文件内容从一种字符编码转换到另外一种[5]
  • cstocs –
  • convmv – 转换文件名.[6]
  • enca – 分析编码模式.[7]

Microsoft Windows:

  • Encoding.Convert – .NET API[8]
  • MultiByteToWideChar/WideCharToMultiByte – Windows API[9]
  • cscvt – 转换工具[10]
  • enca – 分析编码方法[11]

参见

参考文献

  1. ^ Glossary of Unicode Terms
  2. ^ Homepage of Michael Goerz – convert_encoding.py
  3. ^ Decodeh – heuristically decode a string or text file
  4. ^ Recode – GNU Project – Free Software Foundation (FSF)
  5. ^ Utrac Homepage
  6. ^ Convmv – converts filenames from one encoding to another
  7. ^ Extremely Naive Charset Analyser
  8. ^ Microsoft .NET Framework Class Library – Encoding.Convert Method
  9. ^ MultiByteToWideChar/WideCharToMultiByte – Convert from ANSI to Unicode & Unicode to ANSI
  10. ^ Character Set Converter
  11. ^ Extremely Naive Charset Analyser

外部连接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值