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

我很困惑的文字编码和字符集。 出于许多原因,我必须在即将到来的工作中学习非Unicode,非UTF8的东西。

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

文字编码和字符集有什么区别? 如果你能给我看一些用例的例子,我将不胜感激。

基本上:

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

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

然而,我们正在向Unicode过渡,包括一个能够代表几乎所有世界脚本的字符集。 但是,Unicode有多种编码。 编码是将string映射到string的一种方式。 Unicode编码的例子包括UTF-8 , UTF-16 BE和UTF-16 LE 。 这些中的每一个对于特定应用或机器体系结构都具有优点。

除了其他的答案,我认为这篇文章是一个很好的阅读http://www.joelonsoftware.com/articles/Unicode.html

这篇文章的标题是Joel Spolsky绝对的最低限度的软件开发人员,积极地肯定Unicode和字符集(无借口!) ”。 这篇文章已经超过10年了,但不幸的是,内容依然有效。

字符编码包括:

  1. 支持的字符集
  2. 字符和整数(“代码点”)之间的映射
  3. 如何将代码点编码为一系列“代码单元”(例如,UTF-16的16位单元)
  4. 如何将代码单元编码为字节(例如,大端或小端)

步骤#1本身是“字符集”或摘要“字符集”,#1 +#2 =“编码字符集”。

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

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

为以后参观的人投下更多的灯光,希望这会有所帮助。


字符集

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

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

编码的字符集

一个编码字符集是一个集合,其中一个唯一的编号被分配给每个字符。 这个唯一的号码被称为“码点”。
编码字符集有时称为代码页。

编码

编码是将代码点与一些字节进行映射的机制,以便可以使用相同的编码scheme在不同的系统上统一读写字符。

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

以上3个概念的阐述

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

Googlesearch了它。 http://en.wikipedia.org/wiki/Character_encoding

差异似乎是微妙的。 术语字符集实际上不适用于Unicode。 Unicode经历了一系列的抽象。 抽象字符 – >代码点 – >将代码点编码为字节。

字符集实际上跳过这个,直接从字符跳转到字节。 字节序列< – >字符序列

总之,编码:码点 – >字节字符集:字符 – >字节

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

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

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

不过,我知道,MySQL,Java和其他地方可能会使用“charset”这个词来表示字符编码。