为什么“字符集”在实际使用中真的意味着“编码”?


10

长期以来困扰我的是,太多的软件使用术语“字符集”和“编码”作为同义词。

当人们引用unicode的“编码”时,它们总是表示一个规则集,用于将unicode字符表示为字节序列(例如ASCII或UTF-8)。这似乎是合理而直观的。想法是您使用指定的规则集将这些字符“编码”为字节。

由于这些规则集有时仅提供对所有unicode字符的某些子集进行“编码”的能力,因此您可能会想到,“字符集”(“字符集”的缩写)仅表示一组unicode字符,而无需考虑如何这些字符被编码。因此,编码将暗含一个字符集(像ASCII这样的编码,仅具有编码128个字符的规则,将与那些128个字符的字符集相关联),但是字符集不必暗含一种编码(例如,UTF-8,UTF -16和UTF-32都是不同的编码,但是可以编码相同的字符集。

但是-这是我的问题的症结-“字符集”一词在现实世界中的使用与该词的构造所暗示的不匹配。它几乎总是用来表示“编码”。

例如:

这种对语言的好奇(滥用)年龄有多大?“直觉”的反直觉定义是如何形成的?它可能是从一个时间起源当有真正的,在实践中,人物的使用编码与套之间有一个一对一映射他们的支持?还是有一些特别有影响力的标准或规范决定了这个词的定义?


5
由于使用的charset是Unicode标准,所以虽然它可能不是“一对一映射”,但文档所需的字符往往会迫使选择编码。但是我没有时间研究这个词的实际历史……
AmeliaBR 2014年

2
您将字符集称为“一组Unicode字符”,就像有人开始使用Unicode然后选择了子集一样。更准确地说,是在Unicode发明之前(或至少在Unicode普及之前)存在许多字符集,并且故意将Unicode构造为它们的超集。
John Bartholomew 2014年

Answers:


3

字符集的概念早于Unicode。

在Unicode之前,字符集定义了一组字符以及如何将每个字符表示为位。大多数字符集将一个字符映射到一个字节(允许一组256个字符),一些字符集映射到两个字节,而少数(如ASCII)映射到仅7位。不同的字符集通常为同一字符分配不同的值,并且在使用的各种字符集之间没有通用的转换键。

Unicode试图通过统一通用“超集”中的所有各种字符集来解决此问题。为此,Unicode引入了一些附加的抽象级别,例如,字符编码的概念与代码点值分开。这允许Unicode 将预Unicode字符集重新定义为Unicode字符编码。

例如,HTML中的charset属性(反映了HTTP content-type标头中的charset参数)来自unicode广泛采用之前,但是当决定接受unicode作为Internet的通用字符集时,charset属性只是重新定义以指定使用的编码,但名称未更改为允许向后兼容。


9

术语“字符集”当然是“字符集”的缩写,而“字符集”又是用于字符编码的旧术语,可以解释为a)字节和字符序列之间的映射,b)整数之间的映射(代码编号)和字符,或c)抽象字符与整数或字节序列之间的映射。

使用“字符集”是因为它是一个简短的表达。在其中,“集合”的含义不明确(因为整个概念都含糊不清),但后来经常被误解为一个集合(从理论上讲是“集合”),如丹·康纳利(曾经)著名的“ 字符集”中所述被认为有害

然后最重要的是,该标识符charset已在MIME和HTTP中使用。HTTP 1.0别名RFC 1945引用了MIME定义:“一种用于一个或多个表的方法,该方法将一个八位字节序列转换为一系列字符序列”,然后对这种混淆进行评论:“术语'字符集'的这种用法更多通常称为“字符编码”。但是,由于HTTP和MIME共享同一个注册表,因此也必须共享术语。”


1

RFC2045在MIME中引入了“字符集”,到那时,已经很清楚,并不是所有的编码都将一个字符映射到一个八位字节。RFC2130讨论了这段历史。

基本上,“字符集”在编写这些标准时是一个比较流行的术语,它比“字符编码”或“文本编码方案”更简洁,并且比“编码”不那么含糊。


在我看来,'charset'参数已经存在于RFC 1341(1992 6月)中。
约翰·巴塞洛缪

1

至少有两种适用于文本传输的编码。字符编码描述了如何编码字符(字形)。所有语言都使用UCS字符集的子集,这些子集通常被编码为8位值。标准化字符集具有标准字符编码,并且这些术语通常可以互换使用。

传输编码描述了文本的传输方式,通常与字符编码无关。大多数传输编码不是透明的,并且会更改要传输的字节序列。8位传输编码对于8位编码是透明的。7位传输编码只能传输7位字符集,例如ASCII

ASCII使用95个可打印字符,并使用其他几个字符进行7位编码的回车控制(换行,换页,回车,退格和制表符)。使用剩余的值还有其他控制字符。ASCII是UCS字符集以及许多8位字符集的适当子集。ISO-8859-1也是UCS字符集的适当子集,但是这些字符在UTF-8中具有不同的编码,对于大于127的字符值,它使用多个字节。

IBM大型机使用(d)EBCDID,该EBCDID使用不同的8位编码。有一些转换表,它们在ASCII和ECBDIC字符编码之间映射可打印字符。ECBDIC具有比ASCII大的字符集,因为它具有标点符号在ASCII中不可用。如果初始编码为ECBDIC,则这可能会阻止这两种编码之间的完整往返转换。

对于具有ASCII可打印字符未覆盖的字符的语言,这些编码是不够的。Microsoft和其他公司对ASCII字符集使用8位扩展名,并对值大于127的其他字符进行了编码。对于所有语言而言,单个扩展名是不够的,因为这些扩展名最多可将96个字符添加到字符集。这导致多个字符集(字符集)用于具有不同8位字符编码的不同语言。这些字符集包括该语言或语言家族所需的字符。可以将其他字符编码为不同字符集的不同值。英文用户最有可能注意到扩展的标点符号(左右引号和破折号),如果使用了错误的字符集,它们会错误显示。

对于单字节编码,只能对字符集中的字符进行编码。某些语言需要多字节编码才能覆盖其字符集。Unicode(UCS)字符集需要ASCII字符集以外的字符的多字节编码。此字符集是所有特定于语言的编码的超集。UTF-8是UCS字符集的紧凑编码。ASCII不需要额外的字节,并且大多数(全部?)欧洲语言字符都可以编码为一个或两个字节。完整的UCS-2字符集可以被编码为一到三个字节。当前UCS字符集中的所有字符都可以被编码为一到四个字节。


0

FWIW,IIRC,回到Commodore 64天后,字符集就是从{0,... 255}到所有uxv黑白图像集的函数,其中u和v可能分别是8和12。因此,“更改您的字符集”表示使用BASIC语言的POKE命令来修改指定用于保存这些图像的存储位置。例如,ASCII码65表示A,A的图像将从内存地址a * 65 + b开始存储一些b,我想a = u * v。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.