编码和字符集有什么区别?

时间:2010-02-17 14:55:24

标签: encoding character-encoding

我对文本编码和字符集感到困惑。出于很多原因,我必须这样做 在我即将开始的工作中学习非Unicode,非UTF8的东西。

我在电子邮件标题中找到“charset”一词,如“ISO-2022-JP”,但没有 文本编辑器中的这种编码。 (我环顾了不同的文字编辑。)

文本编码和字符集之间有什么区别?我很感激 如果你能告诉我一些用例示例。

11 个答案:

答案 0 :(得分:121)

基本上:

  1. charset是您可以使用的字符集
  2. 编码是这些字符存储到内存中的方式

答案 1 :(得分:75)

每个编码都有一个与之关联的特定字符集,但对于给定的字符集,可以有多个编码。 charset就像它听起来一样,是一组角色。有大量的字符集,包括许多用于特定脚本或语言的字符集。

然而,我们在向Unicode过渡的过程中一直很顺利,其中包括一个能够代表几乎所有世界脚本的字符集。但是,Unicode有多种编码方式。编码是一种将字符串映射到字节字符串的方法。 Unicode编码的示例包括UTF-8UTF-16 BEUTF-16 LE。其中每一项都具有特定应用或机器架构的优势。

答案 2 :(得分:44)

除了其他答案,我认为这篇文章读起来不错 http://www.joelonsoftware.com/articles/Unicode.html

这篇文章的标题是“绝对最少,每个软件开发人员绝对必须知道关于Unicode和字符集(没有借口!)”由Joel Spolsky撰写 。这篇文章已经超过10年了,但(不幸的是)内容仍然有效......

答案 3 :(得分:25)

字符编码包括:

  1. 支持的字符集
  2. 字符和整数之间的映射(“代码点”)
  3. 如何将代码点编码为一系列“代码单元”(例如,UTF-16的16位单元)
  4. 如何将代码单元编码为字节(例如,big-endian或little-endian)
  5. 步骤#1本身是“角色曲目”或抽象“角色集”,#1 +#2 =“编码字符集”。

    但是在Unicode变得流行并且每个人(东亚除外)都在使用单字节编码之前,步骤#3和#4都是微不足道的(代码点=代码单元=字节)。因此,较旧的协议没有清楚地区分“字符编码”和“编码字符集”。较旧的协议在真正意味着编码时会使用charset

答案 4 :(得分:17)

为今后访问的人投入更多光线,希望它会有所帮助。

<小时/>

字符集

每种语言都有字符,这些字符的集合构成该语言的“字符集”。编码字符时,它会分配一个称为代码点的唯一标识符或编号。在计算机中,这些代码点将由一个或多个字节表示。

字符集示例: ASCII(涵盖所有英文字符),ISO / IEC 646,Unicode(涵盖世界上所有生活语言的字符)

编码字符集

编码字符集是一个为每个字符分配唯一编号的集合。该唯一编号称为“代码点” 编码字符集有时称为代码页。

编码

编码是用一些字节映射代码点的机制,这样可以使用相同的编码方案在不同的系统上统一读取和写入字符。

编码示例: ASCII,Unicode编码方案,如UTF-8,UTF-16,UTF-32。

详述上述3个概念

  • 考虑一下 - 梵文中的字符'क'字符集的小数代码点为2325,当两个字节(09 15)表示时使用 UTF-16编码
  • 在“ISO-8859-1”编码方案中,“ü”(这只是拉丁字符集中的字符)表示为FC的十六进制值,而在“UTF-8”中表示为C3 BC,UTF-16为FE FF 00 FC
  • 不同的编码方案可以使用相同的代码点来表示不同的字符,例如在“ISO-8859-1”(也称为Latin1)中,字母“é”的十进制代码点值是233.但是,在ISO中8859-5,相同的代码点代表西里尔字符'ù'。
  • 另一方面,Unicode字符集中的单个代码点实际上可以映射到不同的字节序列,具体取决于文档使用的编码。使用UTF-16编码(09 15)时,代码点2325(以十六进制表示法为915)的梵文字符将由两个字节表示,三个字节使用UTF-8({{1} }),或UTF-32(E0 A4 95
  • 的四个字节

答案 5 :(得分:9)

字符集或字符集只是字符集(无序集合)。编码字符集为曲目中的每个字符分配一个整数(“代码点”)。编码是一种将代码点明确表示为字节流的方法。

答案 6 :(得分:6)

用Google搜索。 http://en.wikipedia.org/wiki/Character_encoding

差异似乎很微妙。术语charset实际上不适用于Unicode。 Unicode经历了一系列抽象。 抽象字符 - &gt;代码点 - &gt;代码的编码指向字节。

Charsets实际上跳过这个并直接从字符跳转到字节。 字节序列&lt; - &gt;字符序列

简而言之, 编码:代码点 - &gt;字节 charset:characters - &gt;字节

答案 7 :(得分:5)

charset只是一个集合;它包含,例如,欧元符号,否则它没有。就是这样。

编码是从字符集到一组整数的双射映射。如果它支持欧元符号,它必须为该字符分配一个特定的整数,而不是其他。

答案 8 :(得分:1)

在我看来,&#34; charset&#34;应限于识别HTTP,MIME和类似标准中使用的参数,以按名称指定字符编码(从一系列文本字符到字节序列的映射)。例如:charset=utf-8

我知道,MySQL,Java和其他地方可能会使用&#34; charset&#34;表示字符编码。

答案 9 :(得分:1)

编码是字符集中字节和字符之间的映射,因此讨论和理解字节字符之间的区别会很有帮助。

将字节视为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将是两个字符,Ã,¢

当计算机在内部存储有关字符的数据或将其传输到另一个系统时,它们会存储或发送字节。想象一下,打开文件或接收消息的系统会看到字节195, 162。它是如何知道这些是什么字符的?

为了让系统将这些字节解释为实际字符(并显示它们或将它们转换为另一种编码),它需要知道所使用的编码。这就是编码出现在XML标头中或可以在文本编辑器中指定的原因。它告诉系统字节和字符之间的映射。

答案 10 :(得分:1)

在我看来,字符集是编码(组件)的一部分,编码具有字符集属性,因此可以在许多编码中使用字符集。例如,unicode是用于诸如UTF-8,UTF-16等编码的字符集。请参见此处的插图:See illustration here

charset中的char并不代表编程世界中的char类型, 它表示现实世界中的字符,用英语可能相同, 但没有其他语言,例如中文, “我”是字符集(UNICODE,GB [用于GBK和GB2312])中不可分割的“ char”, “ a”也是字符集(ASCII,ISO-8859,UNICODE)中的一个字符。