如何从我的xml文件中删除BOM字符

68

我正在使用XSL来控制XML文件的输出,但添加了BOM字符。


不同于纯文本文件,XML文件上的字节顺序标记不应该导致任何问题,因为所有的XML解析器都应该能够处理它,即使它是“UTF-8 BOM”。实际上,XML标准本身就建议将其作为<a href="http://www.w3.org/TR/2006/REC-xml-20060816/#sec-guessing">字符编码自动检测</a>的一部分。 - CesarB
这不是一个建议,F部分并不具有规范性。UTF-8的字节顺序标记(BOM)在Unicode标准中明确允许,但不推荐使用 - http://en.wikipedia.org/wiki/Byte_order_mark#cite_note-2 - UTF-8的BOM并不表示字节顺序。 - mjn
2
看起来不像是重复的问题,因为另一个问题提到了具体的工具。 - vitaut
6个回答

166
# vim file.xml
:set nobomb
:wq

2

只需要在你的XSLT文件中添加这个:

<xsl:output method="text"
        encoding="ASCII"/>

1

只需使用任何十六进制编辑器剥离掉前两个字节即可。


10
第三种情况,取决于UTF编码的类型。 - MSalters
5
UTF-32需要4个字节来编码一个字符,而最常用的XML编码方式UTF-8则只需要3个字节,因此通常使用UTF-8作为XML的编码方式。 - Alan Moore

1

使用 XSLT 从字符串中删除 BOM 符号非常简单:

<xsl:value-of select="translate(StringWithBOM,'','')"/>


0

我认为XML鼓励使用Unicode编写,以某种Unicode编码方式编写,并且指定某些Unicode编码包含初始字节顺序标记。如果没有该字节顺序标记,则文件不再以正确的Unicode编码编码,因此不再是正确的XML。XML处理器被鼓励不宽容,在最轻微的错误(如不正确的Unicode编码)时立即失败。您想要破坏哪种类型的XML处理器?

显然,从UTF-8编码的文档中去掉字节顺序标记会使该文档显示为ASCII编码(而不是Unicode),有些文本处理器仅能使用ASCII编码的文档。 这就是您正在处理的吗?


对于未指定编码且没有BOM的XML文件,UTF-8是默认编码。 - mjn

0

你的XSL使用哪种输出编码?输入文档使用什么编码?输入来自哪里,同时在哪里保存/上传/下载?

如果没有指定其他内容,XML和XSL应默认使用UTF-8。但显然,这里出了些问题。

可能会发生的一件事是,XML由Web服务器提供,该服务器默认设置为以ISO-8859-1提供服务,这是一个相当不错的默认值... Unicode之前的时代。

略微偏题,但Joel的非常有启发性的文章关于文本编码让我大开眼界。有很多人在编程方面非常聪明,但仍然坚持认为存在“纯文本”或称其文本为“ASCII”或“ANSI”。如果你还没有掌握这个问题,那么你真的需要好好处理一下。


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