我对文本编码和字符集感到困惑 在我接下来的工作中学习非 Unicode,非 UTF8的东西。
我在电子邮件标题中发现“ charset”这个词,就像在“ ISO-2022-JP”中一样,但是没有 这样的编码在文本编辑器。(我看了不同的文本编辑器。)
文本编码和字符集有什么区别? 我会很感激的 如果你能给我展示一些用例示例。
每种编码都有一个与之相关联的特定字符集,但是对于给定的字符集可以有多种编码。字符集就是它听起来的样子,一组字符。有大量的字符集,包括许多用于特定脚本或语言的字符集。
但是,我们正在向 Unicode 过渡,Unicode 包括一个能够表示几乎所有脚本的字符集。但是,Unicode 有多种编码方式。编码是将字符串映射为字节串的一种方法。Unicode 编码的示例包括 UTF-8、 UTF-16是和 UTF-16 LE。对于特定的应用程序或机器体系结构,每种方法都具有优势。
基本上:
字符集或字符配置表仅仅是字符的集合(无序集合)。编码字符集将一个整数(“编码点”)分配给配置表中的每个字符。编码是将代码点明确地表示为字节流的一种方法。
一个字符集只是一个集合; 它要么包含,比如欧元符号,要么不包含。
编码是从一个字符集到一个整数集的双射映射。如果它支持欧元符号,它必须为该字符分配一个特定的整数,而不能分配给其他字符。
我谷歌过了。 Http://en.wikipedia.org/wiki/character_encoding
区别似乎很微妙。字符集这个术语实际上并不适用于 Unicode。Unicode 经历了一系列的抽象。 抽象字符-> 代码点-> 代码点到字节的编码。
字符集实际上跳过这一步,直接从字符跳到字节。 字节序列 <-> 字符序列
简而言之, 编码: 代码点-> 字节 字符集: 字符-> 字节
字符编码包括:
步骤 # 1本身是一个“字符库”或抽象的“字符集”,步骤 # 1 + # 2 = 一个“编码字符集”。
但是在 Unicode 流行之前,每个人(除了东亚人)都使用单字节编码,步骤 # 3和 # 4都很简单(code point = code unit = byte)。因此,旧的协议没有明确区分“字符编码”和“编码字符集”。旧的协议在真正意味着编码时使用 charset。
charset
为今后来访的人们提供更多的信息,希望能有所帮助。
每种语言都有字符,这些字符的集合构成了该语言的“字符集”。当一个字符被编码后,它会被分配一个唯一标识符或者一个数字作为编码点。在计算机中,这些代码点将由一个或多个字节表示。
字符集的例子: ASCII (涵盖所有英文字符)、 ISO/IEC 646、 Unicode (涵盖世界上所有现存语言的字符)
编码字符集是为每个字符分配唯一数字的集合。这个唯一的数字被称为“代码点”。 编码字符集有时称为代码页。
编码是用一些字节来映射代码点的机制,以便使用相同的编码方案在不同的系统之间均匀地读写字符。
编码示例: ASCII,Unicode 编码模式,如 UTF-8、 UTF-16、 UTF-32。
09 15
FC
C3 BC
FE FF 00 FC
E0 A4 95
00 00 09 15
在我看来,“字符集”这个词应该仅限于标识 HTTP、 MIME 和类似标准中使用的参数,以便按名称指定一个字符编码(从一系列文本字符到一系列字节的映射)。例如: charset=utf-8。
charset=utf-8
不过,我知道,MySQL、 Java 和其他地方可能会用“ charset”这个词来表示字符编码。
编码是字节和字符集中的字符之间的映射,因此讨论和理解 字节和 角色之间的区别将有所帮助。
可以将字节看作0到255之间的数字,而字符则是抽象的东西,如“ a”、“1”、“ $”和“ Ä”。可用的所有字符集称为 字符集。
每个字符都有一个用于表示它的一个或多个字节的序列; 然而,字节的确切数目和值取决于所使用的 编码,并且有许多不同的编码。
大多数编码基于一个叫做 ASCII 的旧字符集和编码,每个字符只有一个字节(实际上,只有7位) ,包含128个字符,其中包括许多在美国英语中使用的常见字符。
例如,ASCII 字符集中有6个字符,由值60到65表示。
Extract of ASCII Table 60-65 ╔══════╦══════════════╗ ║ Byte ║ Character ║ ╠══════╬══════════════║ ║ 60 ║ < ║ ║ 61 ║ = ║ ║ 62 ║ > ║ ║ 63 ║ ? ║ ║ 64 ║ @ ║ ║ 65 ║ A ║ ╚══════╩══════════════╝
在完整的 ASCII 集中,使用的最低值为零,最高值为127(这两个字符都是隐藏的控制字符)。
但是,一旦您开始需要比基本 ASCII 提供的更多的字符(例如,带重音符号、货币符号、图形符号等) ,ASCII 就不适合了,您需要更多的字符。您需要更多的字符(一个不同的字符集) ,并且需要不同的编码,因为128个字符不足以容纳所有的字符。有些编码提供一个字节(256个字符)或最多六个字节。
随着时间的推移,产生了大量的编码。在 Windows 世界中,有 CP1252,或 ISO-8859-1,而 Linux 用户倾向于使用 UTF-8。Java 在本地使用 UTF-16。
一种编码中字符的一个字节值序列可能代表另一种编码中完全不同的字符,甚至可能是无效的。
例如,在 ISO 8859-1中,* 由一个字节的值 226表示,而在 UTF-8中,它是两个字节: 195, 162。然而,在 ISO 8859-1中,195, 162是两个字符,Ã,。
226
195, 162
当计算机在内部存储有关字符的数据或将其传输到另一个系统时,它们存储或发送字节。假设系统打开一个文件或接收消息时看到字节 195, 162。它怎么知道这些是什么字符?
为了让系统将这些字节解释为实际字符(并显示它们或将它们转换为另一种编码) ,它需要知道所使用的编码。这就是为什么编码出现在 XML 标头中或者可以在文本编辑器中指定的原因。它告诉系统字节和字符之间的映射。
在我看来,字符集是编码(组件)的一部分,编码有一个字符集属性,所以字符集可以用于许多编码。例如,Unicode 是用于 UTF-8、 UTF-16等编码的字符集。请看这里的插图:
Charset 中的 char 并不意味着编程世界中的 char类型。意思是现实世界中的一个角色。在英语中它可能是一样的,但是在其他语言中不像在汉语中,‘我’在字符集中是一个不可分割的‘字符’(Unicode,GB [在 GBK 和 GB2312中使用]) ,‘ a’在字符集中也是一个字符(ASCII,ISO-8859,Unicode)。
char