11

谁能给我一个简明的定义

  • 统一码
  • UTF7
  • UTF8
  • UTF16
  • UTF32
  • 代码页
  • 它们与 Ascii/Ansi/Windows 1252 有何不同

我不是在寻找 wikipedia 链接或令人难以置信的细节,只是一些关于 Unicode 的巨大变化是如何产生的以及为什么会出现以及为什么作为程序员应该关心的一些简短信息。

4

7 回答 7

19

这是一个好的开始:每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2009-09-21T15:00:16.987 回答
13

如果你想要一个非常简短的介绍: Unicode in 5 Minutes

或者,如果您追求单线:

  • Unicode:从 0 到 1,114,111 范围内的字符到整数(“代码点”)的映射;几乎涵盖了所有使用的书面语言
  • UTF7:将码位编码成高位清字节流;一般不使用
  • UTF8:将代码点编码为字节流,其中每个字符可以用一个、两个、三个或四个字节来表示;应该是您编码的主要选择
  • UTF16:将代码点编码为字流(16 位单元),其中每个字符可以用一个或两个字(两个或四个字节)来表示
  • UTF32:将代码点编码为 32 位单元的流,其中每个字符恰好占用一个单元(四个字节);有时用于内部表示
  • 代码页: DOS 和 Windows 中的一个系统,其中字符被分配给整数,以及相关的编码;每个只涵盖语言的一个子集。请注意,这些分配通常不同于Unicode 分配
  • ASCII:一种非常常见的将字符分配给整数,并直接编码为字节(所有高位清除);赋值是 Unicode 的子集,编码是 UTF-8 的子集
  • ANSI:标准机构
  • Windows 1252:常用的代码页;它与 ISO-8859-1 或 Latin-1 类似,但不一样,两者经常混淆

你为什么在乎?因为在不知道使用的字符集和编码的情况下,您并不真正知道给定字节流代表什么字符。例如,字节 0xDE 可以编码

  • Þ(拉丁文大写字母THORN)
  • fi(拉丁文小连字 FI)
  • ή(带 TONOS 的希腊小写字母 ETA)
  • 或 13 个其他字符,具体取决于使用的编码和字符集。
于 2009-09-22T17:16:22.427 回答
6

除了经常被引用的 Joel 之外,我还有我自己的文章,它从以 .NET 为中心的角度来看它,只是为了多样化......

于 2009-09-21T15:09:38.833 回答
3

是的,我得到了一些见解,但它可能是错误的,但它帮助我理解它。

让我们看一些文字。它以一系列字节的形式存储在计算机内存中,代码页只是您和我读取的字节和字符之间的映射表。因此,诸如记事本之类的东西带有它的代码页并将字节转换到您的屏幕上,您会看到一堆垃圾,颠倒的问号等。这并不意味着您的数据是乱码,只是因为读取字节的应用程序没有使用正确的代码页。一些应用程序在检测要使用的正确代码页方面比其他应用程序更智能,并且内存中的一些字节流包含代表字节顺序标记的 BOM,这可以声明要使用的正确代码页。

UTF7、8 16 等都是使用不同格式的不同代码页。

使用不同代码页存储为字节的相同文件将具有不同的文件大小,因为字节存储方式不同。

它们也与 Windows 1252 没有真正的区别,因为那只是另一个代码页。

为了获得更好的更聪明的答案,请尝试其中一个链接。

于 2009-09-21T15:11:24.410 回答
2

在这里,阅读乔尔本人的精彩解释。

每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2009-09-21T15:00:41.353 回答
2

其他人已经指出了足够好的参考。我没有列出真正的 Dummy 指南,而是列出了 Unicode Consortium 页面中的一些指针。您会在 Unicode Consortium 页面上找到使用不同编码的一些更具体的原因。

Unicode 常见问题解答是回答您的一些(不是全部)查询的好地方。

Unicode 网站本身的Newcomer 部分提供了关于 Unicode为何存在的更简洁的答案:

Unicode 为每个字符提供了一个唯一的编号,无论是什么平台,无论是什么程序,无论是什么语言。

至于使用 UTF-8、UTF-16 或 UTF-32 的技术原因,答案在于Unicode 技术简介

UTF-8 在 HTML 和类似协议中很流行。UTF-8 是一种将所有 Unicode 字符转换为可变长度字节编码的方法。它的优点是与熟悉的 ASCII 集对应的 Unicode 字符具有与 ASCII 相同的字节值,并且转换为 UTF-8 的 Unicode 字符可以与许多现有软件一起使用,而无需进行大量的软件重写。

UTF-16 在许多需要平衡字符的高效访问和存储的经济使用的环境中很流行。它相当紧凑,所有大量使用的字符都适合单个 16 位代码单元,而所有其他字符都可以通过一对 16 位代码单元访问。

UTF-32 在不关心内存空间但需要固定宽度、单个代码单元访问字符的情况下很受欢迎。使用 UTF-32 时,每个 Unicode 字符都以单个 32 位代码单元编码。

所有三种编码形式每个字符最多需要 4 个字节(或 32 位)的数据。

一般的经验法则是当您的应用程序支持的主要语言在印度河以西使用时使用 UTF-8,对面(印度河以东)使用 UTF-16,当您担心使用字符时使用 UTF-32具有统一的存储。

顺便说一句,UTF-7 不是 Unicode 标准,主要设计用于邮件应用程序。

于 2009-09-21T15:36:59.683 回答
0

我不是在寻找 wikipedia 链接或令人难以置信的细节,只是一些关于 Unicode 的巨大变化是如何产生的以及为什么会出现以及为什么作为程序员应该关心的一些简短信息。

首先,没有“unicode 的变体”。Unicode 是一种标准,即标准,用于将代码点(整数)分配给字符。UTF8 是将这些整数表示为字节的最流行方式!

作为程序员,你为什么要关心?

  • 理解这一点很有趣!
  • 如果您对编码没有基本的了解,则很容易产生错误代码。

示例:您myByteArray从某个地方收到一个 ByteArray,并且您知道它代表字符。然后你运行myByteArray.toString()并得到字符串Hello。你的程序有效!发送代码一天后,您的德国客户致电:“我们遇到问题,äöü 显示不正确!”。你开始调试代码,如果没有对编码有基本的了解,你会感觉很迷茫。但是,通过对编码的理解,您知道错误可能是这样的:运行时myByteArray.toString(),您的程序假定字符串是使用默认系统编码进行编码的。但也许不是!也许它是 UTF8 并且您的系统是拉丁语,所以您应该运行它myByteArray.toString("UTF8")

资源:

我不会像其他人建议的那样推荐 Joel 的文章。这是一篇很长的文章,里面有很多不相关的信息。几年前我读过它,它的精髓并没有留在我的脑海里,因为有很多不重要的细节。

如前所述, http://wiki.secondlife.com/wiki/Unicode_In_5_Minutes是一个了解 unicode 本质的好地方。

如果您想真正了解像 UTF8 这样的可变长度编码,我建议您https://www.tsmean.com/articles/encoding/unicode-and-utf-8-tutorial-for-dummies/

于 2021-09-18T14:13:15.603 回答