Dav*_*len 3 unicode utf-8 character-encoding
我必须编写一些使用字符编码的代码.是否有一个很好的介绍这个主题让我开始?
首先发布在每个开发人员应该了解的字符编码方面.
如果您编写的代码接触文本文件,您可能需要这样做.
让我们从两个关键项目开始
1.Unicode并没有为我们解决这个问题.
2.每个文本文件都是编码的.没有未编码的文件或"通用"编码.并且让我们添加一个codacil - 大多数美国人可以通过而不必考虑到这一点 - 大部分时间.因为绝大多数编码方案中前127个字节的字符映射到同一组字符(更准确地称为字形).而且因为我们只使用AZ而没有任何其他角色,口音等等 - 我们很高兴.但是第二个你在HTML或XML文件中使用相同的假设,其中包含前127个字符之外的字符 - 然后麻烦就开始了.
计算机行业从磁盘空间和内存开始非常重要.建议每个字符使用2个字节而不是一个字符的人都会被嘲笑.事实上,我们很幸运,该字节最适合作为8位,或者每个字符可能少于256位.当然,早期开发了许多字符集(或代码页).但是我们最终大多数人都使用一组标准的代码页,其中前127个字节在所有代码页上都是相同的,第二个字节对每个代码集都是唯一的.有美国/西欧,中欧,俄罗斯等国家和地区.
然后对于亚洲,因为256个字符是不够的,128到255的一些范围有所谓的DBCS(双字节字符集).对于第一个字节的每个值(在这些较高范围内),第二个字节然后标识256个字符中的一个.这总共增加了128*256个字符.这是一个黑客攻击,但它将内存使用保持在最低限度.中文,日文和韩文都有自己的DBCS代码页.
一段时间以来效果很好.操作系统,应用程序等大多数都设置为使用指定的代码页.但随后互联网出现了.美国的一个网站,使用希腊的XML文件向在俄罗斯浏览的用户显示数据,每个用户根据他们的国家输入数据 - 这打破了范例.
快进到今天.我们可以解释这个最好的两种文件格式,以及每个人在它上面浏览的格式都是HTML和XML.每个HTML和XML文件都可以选择在其标题元数据中设置字符编码.如果它没有设置,那么大多数程序都假设它是UTF-8,但这不是标准,也不是普遍遵循的.如果未指定编码并且读取文件的程序猜错 - 则文件将被误读.
第1点 - 在编写文件时,永远不要将编码指定为可选.始终将其写入文件.总是.即使你愿意发誓该文件永远不会有1到127之间的字符.
现在让我们'看看UTF-8,因为它作为标准和它的工作方式,它让人们遇到很多麻烦.UTF-8很受欢迎有两个原因.首先,它匹配前127个字符的标准代码页,因此大多数现有的HTML和XML都匹配它.其次,它被设计为使用尽可能少的字节,这在设计时很重要,许多人仍在使用拨号调制解调器.
UTF-8借鉴了亚洲代码页的DBCS设计.前128个字节都是字符的单字节表示.然后,对于下一个最常见的集合,它使用第二个128字节中的块作为双字节序列,为我们提供更多字符.但等等,还有更多.对于较不常见的是第一个字节,它导致第二个字节的sersies.然后每个都导致第三个字节,这三个字节定义字符.这最多可达6个字节序列.使用MBCS(多字节字符集),您可以编写每个unicode字符的等效值.假设您所写的内容不是很少使用中文字符的列表,请用更少的字节来完成.
但是这里是每个人都会绊倒的 - 他们有一个HTML或XML文件,它工作正常,并且他们在文本编辑器中打开它.然后,他们在文本编辑器中添加一个字符,使用其区域的代码页,插入像ß这样的字符并保存文件.当然它必须是正确的 - 他们的文本编辑器正确显示它.但是把它提供给任何根据编码读取的程序,现在是2字节序列的第一个字符.您要么获得不同的字符,要么第二个字节不是第一个字节的合法值 - 错误.
第2点 - 始终在使用编码正确写出的程序中创建HTML和XML.如果必须使用文本编辑器创建,则在浏览器中查看最终文件.
现在,您正在编写的代码何时读取或写入文件?我们不是在讨论以您自己的格式编写的二进制/数据文件,而是将文件视为文本文件.Java,.NET等都有字符编码器.这些编码器的目的是在字节序列(文件)和它们代表的字符之间进行转换.让我们看看实际上非常困难的例子 - 您的源代码,无论是C#,Java等.这些仍然是大型"普通旧文本文件",没有编码提示.那么程序如何处理它们呢?许多人假设他们使用本地代码页.许多其他人认为所有字符都在0到127之间,并且会阻塞其他任何字符.
这是关于这些文本文件的关键点 - 每个程序仍在使用编码.它可能不是在代码中设置它,但根据定义,正在使用编码.
第3点 - 在读取和写入文本文件时始终设置编码.不仅适用于HTML和XML,甚至适用于源代码等文件.如果您将其设置为使用默认代码页,但设置编码,则可以.
第4点 - 尽可能使用最完整的编码器.您可以将自己的XML编写为以UTF-8编码的文本文件.但是如果你使用XML编码器编写它,那么它将在元数据中包含编码,你就不会错.(它还将endian前导码添加到文件中.)
好的,你正在正确地阅读和编写文件,但是你的代码内部是什么.那有什么?这是很容易的地方 - unicode.这就是那些在Java和.NET运行时创建的编码器的设计目的.你读入并获得unicode.你编写unicode并获得一个编码文件.这就是为什么char类型是16位并且是用于字符的唯一核心类型.你可能有权利,因为今天的语言在这个问题上没有给你太多选择.
第5点 - (对于已经存在一段时间的语言的开发人员) - 始终在内部使用unicode.在C++中,这称为宽字符(或类似的东西).不要聪明地保存几个字节,内存便宜并且你有更重要的事情要做.
把它包起来
我认为这里要记住两个关键项目.首先,确保您正在对文本文件进行编码.其次,这实际上非常简单明了.人们很少搞砸如何使用编码,当他们忽略了他们遇到麻烦的问题时.
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |