- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须编写一些使用字符编码的代码。是否有关于该主题的很好的入门指南?
最佳答案
最初发布于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/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!