3

我有一个 xml 文件。当我用 Emacs 打开它时,它会显示中文字符(见附件)。这发生在我的带有 Emacs 和记事本的 Windows 7 PC 上,也发生在我的 Windows XP 上(见图 A)。图 B 是 A 的十六进制模式。

在此处输入图像描述

如果我用的是同事的Windows XP电脑,用记事本打开文件,里面没有汉字,而是一个奇怪的字符。我将它保存为 txt 文件并通过电子邮件发送到我的 Windows7-PC(见图 C)。奇怪的字符被替换为“?”。(由于限制,我无法使用我同事的 PC 并复制带有奇怪字符的记事本文件)。

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

4

3 回答 3

6

通过图 B,看起来这个文件是用大端和小端 UTF-16 混合编码的。它以 开头fe ff,这是大端 UTF-16 的字节顺序标记,XML 声明 ( <?xml version=...) 也是大端,但以<report小端开头的部分。您可以分辨出来,因为这些字母出现在 hexl 显示的第一部分的偶数位置,但在更下方的奇数位置。

此外,在 . 之前还有一个空字符(编码为两个字节,00 00<report。XML 文档中不允许使用空字符。

但是,由于某些 XML 元素在图 A 中正确显示,因此文件中似乎存在混淆。该文件已损坏,这可能需要手动解决。

如果文件中没有非 ASCII 字符,我会尝试在 Emacs 中以二进制形式打开文件(M-x revert-buffer-with-coding-system并指定binary),删除所有空字节(M-% C-q C-@ RET RET),保存文件并希望一切顺利。

另一种可能的解决方案是用汉字标记每个出现的区域并用重新编码,将M-x recode-region“文本确实在”utf-16-le和“但被解释为”作为utf-16-be

于 2013-08-19T11:17:37.910 回答
1

出于某种原因,Emacs 将 xml 文件编码属性中的“UTF-16”作为大端,而 Windows 将“UTF-16”作为小端(例如从任务计划程序导出时)。如果您编辑并保存 xml 文件,Emacs 会在不知不觉中自动将 LE 转换为 BE。您可以将鼠标悬停在左下方的“U”上以查看当前编码。encoding="UTF-16LE" 或 encoding="UTF-16BE" 将在保存后破坏文件(无 BOM)。我相信最新版本已经修复了这个问题。

<?xml version="1.0" encoding="UTF-16"?>
<hi />
于 2019-05-16T15:07:15.580 回答
0

legoscia 的解决方案使用 Emacs 更改文件中的编码的可能性解决了我的问题。另一种可能性是:

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

就我而言,它适用于 Atom,但不适用于 Notepad++。

PS:我使用这种方式的原因是Emacs无法再打开这种损坏的文件。我不知道为什么,但这是另一个问题。

编辑 1:由于复制、粘贴和合并很麻烦,我找到了如何使用 emacs 打开损坏文件的解决方案:emacs -q xmlfile.xml. 使用像 legoscia 这样的 emacs 是修复此类文件的最佳方法。

于 2019-01-24T09:27:15.823 回答