有人能解释这种与编码相关的行为吗?

有人能解释这种与编码相关的行为吗?

尽管我读过不少书,但编码不是我的强项。

我想要编辑一个文件,它的扩展名是 .tdl,但这并没有什么特别的含义。

它是一个 XML 文件。第一行如下所示:

<?xml version="1.0" encoding="utf-16"?>

当我尝试使用 gedit 打开此文件时,我收到一条黄色背景上的大消息,内容是:

“打开文件时出现问题...您打开的文件包含一些无效字符。如果继续编辑此文件,可能会损坏此文档。您也可以选择其他字符编码,然后重试”

下方的字符编码下拉框显示“当前区域设置 (UTF-8)”。

我尝试将其设置为“Unicode (UTF-16)”,然后单击“重试”。令人讨厌的消息再次出现,下拉菜单重新设置为“当前语言环境 (UTF-8)”。

我也尝试通过以下方式打开文件:文件 --> 打开 --> 字符编码:将“自动检测”更改为“Unicode (UTF-16)”。但我再次收到令人讨厌的消息,再次将下拉列表设置为“当前区域设置 (UTF-8)”。

通过编程(使用 Groovy groovy.xml.XMLParser),我能够解析此文件并生成看似有效的groovy.util.Node结构。我尚未到达尝试保存此内部 Node 结构的阶段,无论是否已修改。

有人能告诉我这个文件有什么问题(如果有的话)吗,以及我如何安全地编辑它?

答案1

在 UTF-16 中,字符占用两个字节,对于 ASCII 字符,高字节为 0x00。

例如“Something”在UTF-16中是:

00000000  ff fe 53 00 6f 00 6d 00  65 00 74 00 68 00 69 00  |..S.o.m.e.t.h.i.|
00000010  6e 00 67 00 0a 00                                 |n.g...|

OxFFFE开头的是字节顺序标记,如果看到 0xFEFF,您就知道必须交换字节...)。

到处都是 NUL 字符确实让软件感到困惑......

您可以使用以下方式转换为更合理的 UTF-8 iconv

iconv -f UTF-16 -t UTF-8 <utf16file >utf8file

不要忘记更改文件头中的编码

答案2

如果文件是 UTF-16(Windows 典型编码),则在 Linux 下会遇到麻烦(UTF-8 原生,好战......)。至少 GNU emacs 表示它支持 UTF-16,但从未愤怒地使用过它。

您可以尝试使用 recode(1) 将其转换为 UTF-8(并修复标题等以进行匹配),但这可能会严重破坏期望 UTF-16 的工具。

更新:刚刚想到了这一点:重新编码为 UTF-8;随意进行 mangle、spindle 和 deface;重新编码回 UTF-16。这样你就可以在中间使用熟悉的工具。但是修复已宣布的 UTF-16 编码,谁知道工具是否会混淆。或者 XML 处理工具确实注意到了这一点……

相关内容