我有一个xml文件。当我用Emacs打开它时,它会显示中文字符(参见附件)。这种情况发生在带有Emacs和Notepad的Windows 7 PC上以及我的Windows XP上(见图A)。图B是A的hexl模式。
如果我使用同事的Windows XP PC并使用记事本打开文件,则没有中文字符,但有一个奇怪的字符。我把它保存为txt文件并通过电子邮件发送到我的Windows7-PC(见图C)。奇怪的角色被“?”取代。 (由于限制,我无法使用我的同事的PC并使用奇怪的角色重现记事本文件)。
我的问题:似乎XML文件中存在会产生问题的字符。我不知道如何应对。有人知道如何解决这个问题吗?它与编码有关吗?谢谢提示。
答案 0 :(得分:6)
通过图B,看起来这个文件是用big-endian和little-endian UTF-16混合编码的。它以fe ff
开头,它是big-endian UTF-16的字节顺序标记,XML声明(<?xml version=...
)也是big-endian,但是以<report
开头的部分是小端的。你可以看出,因为字母出现在hexl显示的第一部分的偶数位置,但是在更低的奇数位置。
此外,在00 00
之前有一个空字符(编码为两个字节,<report
)。 XML文档中不允许使用空字符。
但是,由于某些XML元素在图A中正确显示,因此似乎混淆了整个文件。该文件已损坏,可能需要手动解决。
如果文件中没有非ASCII字符,我会尝试在Emacs中打开文件为二进制文件(M-x revert-buffer-with-coding-system
并指定binary
),删除所有空字节({{1} }),保存文件并希望最好。
另一种可能的解决方案是将每个区域标记为中文字符并使用M-% C-q C-@ RET RET
进行重新编码,将“文本确实在”作为M-x recode-region
和“但被解释为”为utf-16-le
}。
答案 1 :(得分:0)
使用Emacs更改文件内编码的可能性对legoscia的解决方案解决了我的问题。另一种可能性是:
就我而言,它适用于Atom,但不适用于Notepad ++。
PS:之所以使用这种方式,是因为Emacs再也无法打开这种损坏的文件。我不知道为什么,但这是另一个问题。
编辑1:由于复制,粘贴和合并很麻烦,因此我找到了如何使用emacs打开emacs -q xmlfile.xml
损坏的文件的解决方案。建议使用像Legoscia这样的emacs来修复此类文件的最佳方法。
答案 2 :(得分:0)
由于某种原因,Emacs将xml文件编码属性中的“ UTF-16”作为大字节序,而Windows将“ UTF-16”作为小字节序(例如从Task Scheduler导出时)。如果您编辑和保存xml文件,Emacs会在不知不觉中自动将LE转换为BE。您可以将鼠标悬停在左下角的“ U”上以查看当前的编码。保存后(没有BOM表),encoding =“ UTF-16LE”或encoding =“ UTF-16BE”将破坏文件。
<?xml version="1.0" encoding="UTF-16"?>
<hi />