BOM与XML中的显式编码声明



只是想知道XML为什么使用显式编码声明。对我来说,这看起来像是一个奇怪的设计。考虑一个UTF-16编码声明(参见示例)。流/文件开头的BOM不是让它过时了吗?如果BOM指示UTF-16,并且显式编码声明设置为UTF-8,会发生什么情况?这有道理吗?

<?xml version="1.0" encoding="utf-16" ?>

如何区分ISO-8859-1编码的文档和ISO-8859-2编码的文档?根本没有BOM,如果没有XML声明说明使用了哪种编码,就无法推断编码。如果XML只允许UTF-8和UTF-16,那么基于BOM的检测可能就足够了,尽管我记得Java世界中早期的XML解析器受到UTF-8 BOM的挑战。因此,基本上,为了支持大量的编码,需要XML声明来声明所使用的编码。

据报道,由于读取错误编码的数据,StackOverflow上出现了大量问题。遗憾的是,当您从文件存储中读取文件,或通过HTTP等协议获取消息时,通常没有可用的编码信息,而且当有编码信息时,通常是不可靠的。将编码放在文件的头中只是解决这个问题的一种务实而不完美的尝试(BOM是另一种)。这并不是全部答案(因为例如,文件传输操作等不支持XML的进程很容易在不更改XML声明的情况下更改编码),但它有帮助。

最新更新