gpt4 book ai didi

unicode - 在哪里可以找到有关字符编码的良好介绍?

转载 作者:行者123 更新时间:2023-12-02 21:08:32 25 4
gpt4 key购买 nike

我必须编写一些使用字符编码的代码。是否有关于该主题的很好的入门指南?

最佳答案

最初发布于What every developer should know about character encoding

如果编写的代码涉及文本文件,则可能需要此代码。

让我们从两个关键项目开始

1.Unicode还没有为我们解决这个问题(至今)。

2.每个文本文件都经过编码。没有未编码的文件或“常规”编码。
并让它增加一个轻松愉快的感觉-大多数美国人在大多数情况下都可以通过而不必考虑到这一点。因为在绝大多数编码方案中,前127个字节的字符都映射到相同的字符集(更准确地称为字形)。而且因为我们只使用A-Z,而没有其他字符,重音符号等,所以我们很高兴。但是第二个问题是在HTML或XML文件中使用相同的假设,而第一个127个字符之外的字符–然后麻烦就开始了。

计算机工业从磁盘空间和内存开始。建议将每个字符使用2个字节而不是一个字符的任何人都会被嘲笑。实际上,我们很幸运,该字节以8位的形式工作得最好,否则每个字符可能少于256位。当然,早期就有许多字符集(或代码页)被开发出来。但是最后,大多数人使用的是一组标准的代码页,其中前127个字节在所有代码集上都是相同的,而第二个对于每个集是唯一的。这里有美国/西欧,中欧,俄罗斯等地的集市。

然后对于亚洲,由于256个字符不够用,因此128至255之间的某些范围具有所谓的DBCS(双字节字符集)。对于第一个字节的每个值(在这些较高的范围内),第二个字节然后标识为256个字符中的一个。这样总共提供了128 * 256个附加字符。这是一个hack,但将内存使用降至最低。中文,日文和韩文都有自己的DBCS代码页。

一段时间以来,这很好。操作系统,应用程序等大多设置为使用指定的代码页。但是随后出现了互联网。美国的一个网站使用来自希腊的XML文件向在俄罗斯浏览的用户显示数据,每个用户都根据各自的国家/地区输入数据,这打破了范例。

快进到今天。我们可以最好地解释这两种文件格式,以及每个人都可以理解的两种文件格式是HTML和XML。每个HTML和XML文件都可以选择在其标头元数据中设置字符编码。如果未设置,则大多数程序会假定它为UTF-8,但这不是标准,并且未得到普遍遵循。如果未指定编码,并且读取文件的程序猜错了–文件将被误读。

要点1 –写入文件时,请勿将编码指定为可选。始终将其写入文件。总是。即使您愿意保证该文件绝不会包含超出1到127范围的字符。

现在让我们看一下UTF-8,因为作为标准及其工作方式,它使人们陷入了很多麻烦。 UTF-8之所以受欢迎,有两个原因。首先,它与前127个字符的标准代码页匹配,因此大多数现有的HTML和XML都将其匹配。其次,它被设计为使用尽可能少的字节,这在设计之初就非常重要,并且许多人仍在使用拨号调制解调器。

UTF-8从亚洲代码页的DBCS设计中借用。前128个字节全部是字符的单字节表示形式。然后,对于下一个最常见的集合,它使用后128个字节中的一个块为双字节序列,从而为我们提供更多字符。但是,等等,还有更多。对于较不常见的情况,有一个第一个字节导致一系列第二个字节。然后,它们分别导致第三个字节,而这三个字节定义字符。最多增加6个字节的序列。使用MBCS(多字节字符集),您可以写入每个unicode字符的等价字符。并且假设您所写的不是一个很少使用的汉字列表,则以较少的字节数来完成。

但是,这是每个人都需要经历的事情–他们有一个HTML或XML文件,它工作正常,并在文本编辑器中将其打开。然后,他们使用其区域的代码页在文本编辑器中添加一个字符,并插入一个像ß这样的字符并保存文件。当然,它必须是正确的-他们的文本编辑器可以正确显示它。但是,将其提供给根据编码读取的任何程序,该程序现在是2字节序列的第一个字符。您或者会得到一个不同的字符,或者第二个字节不是该第一个字节的合法值,这是一个错误。

第2点–始终在使用编码正确写出的程序中创建HTML和XML。如果必须使用文本编辑器创建,请在浏览器中查看最终文件。

现在,您正在编写的代码何时将读取或写入文件呢?我们不是在谈论二进制/数据文件,而是以自己的格式写出来的文件,而是被认为是文本文件的文件。 Java,.NET等都具有字符编码器。这些编码器的目的是在字节序列(文件)和它们表示的字符之间转换。让我们看一下实际上是一个非常困难的示例-您的源代码,例如C#,Java等。这些仍然基本上都是“普通的旧文本文件”,没有任何编码提示。那么程序如何处理它们?许多人假设他们使用本地代码页。许多其他人都假定所有字符都在0到127的范围内,并且会窒息其他任何东西。

这是有关这些文本文件的关键点–每个程序仍在使用编码。它可能没有在代码中设置它,但是根据定义,正在使用一种编码。

第3点–读写文本文件时,请务必设置编码。不仅适用于HTML和XML,甚至适用于源代码之类的文件。如果将其设置为使用默认代码页,但设置编码,则可以。

点4 –尽可能使用最完整的编码器。您可以将自己的XML编写为针对UTF-8编码的文本文件。但是,如果使用XML编码器编写它,那么它将在元数据中包含编码,并且不会出错。 (它还将字节序前导添加到文件中。)

好的,您正在正确读写文件,但是在代码内部呢?那有什么?这很容易-unicode。这就是在Java&.NET运行时中创建的编码器的目的。您读入并获得unicode。您编写unicode并获取一个编码文件。这就是为什么char类型为16位并且是用于字符的唯一核心类型的原因。您可能是正确的,因为当今的语言在这方面没有给您太多选择。

第5点–(对于使用已有一段时间的语言的开发人员)–始终在内部使用unicode。在C ++中,这称为宽字符(或类似字符)。不要聪明地保存几个字节,内存很便宜,您还有很多重要的事情要做。

包起来

我认为这里要记住两个关键项目。首先,请确保考虑到文本文件的编码。其次,这实际上非常简单明了。人们很少搞清楚如何使用编码,就是在他们忽略麻烦的时候。

关于unicode - 在哪里可以找到有关字符编码的良好介绍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com