程序如何确定XML文件的编码?

4

在处理(反序列化)XML文件时,我对XML编码有疑问。 我们在文件开头指定XML文件的编码方式如下。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我的问题是,程序读取这一行后,便确定接下来的内容采用UTF-8编码。但在读取第一行时,程序如何确定它采用的是UTF-8编码呢?我的意思是,在读取字节流的同时,程序如何知道它需要使用哪种编码来读取第一行?

谢谢, Mayuran

1个回答

2

在xml规范的F.1节中写道:

F.1无外部编码信息的检测

因为每个没有外部编码信息且不以UTF-8或UTF-16编码的XML实体必须以XML编码声明开头,在其中第一个字符必须是<?xml,任何符合规范的处理器都可以在输入两到四个八位组后检测出以下哪种情况适用。阅读此列表时,可能有助于知道在UCS-4中,<#x0000003C?#x0000003F,并且UTF-16数据流所需的字节顺序标记是#xFEFF。符号##用于表示除两个连续的##不能同时为00之外的任何字节值。

基本上,有两个选择:

  1. 有字节顺序标记(BOM)
  2. 没有BOM。

规范随后明确记录了特定八位字节流的表格,处理器应使用这些表格来确定要使用的编码,直到看到encoding声明。


在那儿。我正在查看规范,知道它在那里,但在你发布上面的内容之前还没来得及看到F.1。棒极了。 - T.J. Crowder
@RobAu,感谢您的回答,但我仍然无法理解,要读取文本"<?xml",它必须首先决定编码,不是吗?没有决定编码,它怎么知道它是"<?xml"。我相信只有使用UTF-8编码才是"<?xml"。如果我们使用其他编码,它可能会被解释为不同的字符集。这只是我的想法,请纠正我如果我错了。 - Mayuran
如果没有字节顺序标记,您应该读取前几个字节并尝试不同的编码,例如UTF-16。给出字符串“<?xml”的编码是您应该用来读取其余部分的编码。 - Rob Audenaerde
1
从技术上讲,附录F是非规范性的;XML实际上并没有定义不带外部编码元数据的处理方式,而只是说明了如何处理。 - gsnedders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接