只是想知道为什么XML使用显式编码声明。对我来说,它看起来像一个奇怪的设计。 考虑一个UTF-16编码声明(参见示例)。在流/文件的开头没有BOM会使这个过时吗?如果BOM表示UTF-16并且显式编码声明设置为UTF-8,会发生什么?这甚至没有任何意义吗?
<?xml version="1.0" encoding="utf-16" ?>
答案 0 :(得分:4)
您如何区分ISO-8859-1编码文档和ISO-8859-2编码文档?根本没有BOM,如果没有XML声明说明使用了哪种编码,则无法推断编码。如果XML只允许UTF-8和UTF-16,那么基于BOM的检测可能已经足够了,尽管我认为我记得Java世界中早期的XML解析器受到UTF-8 BOM的挑战。 基本上,为了支持大量的编码,需要XML声明来声明使用的编码。
答案 1 :(得分:2)
由于读取错误编码的数据,StackOverflow上报告了大量问题。遗憾的是,当您从文件存储区读取文件或通过某些协议(如HTTP)获取消息时,通常没有可用的编码信息,并且当存在时,它通常是不可靠的。将编码放在文件的标题中只是一个实用且不完美的尝试来解决这个问题(BOM是另一个)。这不是完整的答案(因为例如,非XML感知的过程非常容易,例如文件传输操作在不更改XML声明的情况下更改编码),但它有所帮助。