如果我打开xml文件,Emacs会显示中文字符

时间:2013-08-19 10:19:38

标签: emacs encoding

我有一个xml文件。当我用Emacs打开它时,它会显示中文字符(参见附件)。这种情况发生在带有Emacs和Notepad的Wi​​ndows 7 PC上以及我的Windows XP上(见图A)。图B是A的hexl模式。

enter image description here

如果我使用同事的Windows XP PC并使用记事本打开文件,则没有中文字符,但有一个奇怪的字符。我把它保存为txt文件并通过电子邮件发送到我的Windows7-PC(见图C)。奇怪的角色被“?”取代。 (由于限制,我无法使用我的同事的PC并使用奇怪的角色重现记事本文件)。

我的问题:似乎XML文件中存在会产生问题的字符。我不知道如何应对。有人知道如何解决这个问题吗?它与编码有关吗?谢谢提示。

3 个答案:

答案 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的解决方案解决了我的问题。另一种可能性是:

  1. 切割要转换的零件
  2. 粘贴新文件并保存
  3. 使用可以转换编码的编辑器打开
  4. 转换文件并保存
  5. 复制转换后的字符串并将其添加(粘贴)到剪切要转换的部分的原始文件中

就我而言,它适用于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 />