尽管我读过不少书,但编码不是我的强项。
我想要编辑一个文件,它的扩展名是 .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 处理工具确实注意到了这一点……