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

TK.*_*TK. 142 encoding character-encoding

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

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

文本编码和字符集之间有什么区别?如果您能向我展示一些用例示例,我将不胜感激.

Sve*_*lov 133

基本上:

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

  • 是的,但在实际使用中,"charset"通常指的是*两个字符库和编码方案. (42认同)
  • 这不完全正确.例如,Unicode指的是字符集,但有多种可能的编码(UTF-8,UTF-16,UTF-32). (2认同)

Mat*_*hen 81

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

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

  • 请注意,javadoc错误地使用"charset"而不是"encoding",例如在[InputStreamReader](http://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html)中,我们读到了*"InputStreamReader是从字节流到字符流的桥接:它使用指定的字符集读取字节并将它们解码为字符.它使用的字符集可以通过名称指定或者可以明确指定,或者平台的默认字符集可能是公认."*.然而,他们的意思是"编码". (20认同)
  • 感谢您的解释。** Unicode **是字符集,** UTF-8 **是** Unicode **的一种编码方式,** UTF-16 **是** Unicode **的另一种编码方式。 (3认同)

mat*_*nja 45

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

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

  • 通过简单解释*为什么*我应该阅读Joel的文章,可以改进这个答案. (8认同)
  • 非常感谢您介绍这篇文章.它*是一个很好的. (2认同)

dan*_*n04 26

字符编码包括:

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

步骤#1本身是"字符集"或抽象"字符集",#1 +#2 ="编码字符集".

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


hag*_*wal 20

为今后访问的人们提供更多的光线,希望它会有所帮助.


字符集

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

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

编码字符集

编码字符集是一个集合,其中为每个字符分配唯一编号.该唯一编号称为"代码点".
编码字符集有时称为代码页.

编码

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

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

阐述以上3个概念

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


Jon*_*erg 11

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


小智 7

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

\n

请参阅此处的插图

\n

字符集中的字符并不意味着char编程世界中的类型。它意味着现实世界中的角色。在英语中可能是相同的,但在其他语言中则不然,比如中文,\'\xe6\x88\x91\'是字符集中不可分割的\'char\'(Unicode,GB [用于 GBK 和 GB2312]), \'a\' 也是字符集中的字符(ASCII、ISO-8859、Unicode)。

\n


Fak*_*een 6

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

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

Charsets实际上跳过这个并直接从字符跳转到字节.字节序列< - >字符序列

简而言之,编码:代码点 - >字节字符集:字符 - >字节


Kil*_*oth 5

charset只是一套; 它要么包含,例如欧元符号,要么它不包含.就这样.

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

  • 那么,编码和解码应该是确定性的,所以实际上不能有任何模糊的映射.我想你可以有一个非连续的整数集作为codomain,但是当你存储文本时会浪费空间,工程师讨厌浪费空间. (2认同)