2

我不确定我的命名是否正确,所以请纠正我:)

我收到了一个代表巴利语词典的文本文件:由换行符\n(0x0a) 字符分隔的单词列表。据说,一些特殊字母是使用 UTF-8 编码的,但我对此表示怀疑。

将此文本文件加载到我的任何编辑器(vim、Notepad、TextEdit、..)中都会显示非常混乱的文本,例如

mhiti

仔细查看实际字节,然后显示以下内容(使用hexdump -C

0a 0a 1e 6d 68 69 74 69 0a 0a  ...mhiti..

在我看来,这是 Unicode 代码点U+1E6D(“ṭ”或拉丁小写字母 T,下面带有点)。该特定字母具有 UTF-8 编码e1 b9 ad

我的问题:是否有工具可以帮助我将此特定文件转换为实际的 UTF-8 编码?我试过iconv但没有成功;我简要地查看了一个 Python 脚本,但认为有一种更简单的方法可以完成这项工作。似乎是解决此问题的有用链接,但是没有可以完成此操作的工具吗?我错过了什么吗?

编辑:只是为了让事情更有趣一点,似乎也散布着实际的 UTF-8 编码字符。例如,单词“ ākiñcaññāyatana ”具有以下字节序列

01 01 6b 69 c3 b1 63 61 c3 b1 c3 b1 01 01 79 61 74 61 6e 61
ā     k  i  ñ     c  a  ñ     ñ     ā     y  a  t  a  n  a

其中“ā”由其 Unicode 代码点 U-0101 编码,“ñ”由 UTF-8 序列 \xc3b1 编码,该序列具有 Unicode 代码点 U-00F1。

编辑:这是一个我无法弄清楚它应该是什么的:

01 1e 37 01 01 76 61 6b 61
?        ā     v  a  k  a

我只能猜测,但这也没有意义。Unicode 代码点 U+011e 是“Ğ”(UTF-8 \xc49e),但这不是巴利语字符 AFAIK;然后是一个“7”,这在一个词中没有意义。那么 Unicode 代码点 U+1E37 是一个“ḷ”(UTF-8 \xe1b8b7),它是一个有效的巴利语字符。但这会留下第一个字节 \x01 本身。如果我不得不猜测,我会认为这是名称“Jīvaka”,但这与字节不匹配。 稍后:根据作者的说法,这是“Āḷāvaka”——因此假设从上面的字符编码启发式算法,又缺少一个 \x00。重新添加

01 00 1e 37 01 01 76 61 6b 61
Ā     ḷ     ā     v  a  k  a

是否存在从 UTF-16 编码的 Unicode 文件中删除 \x00 字节的“压缩”?

4

2 回答 2

3

在这种情况下,我假设“ ṭhiti ”作为该文件的内容是有意义的。

根据您的描述,该文件似乎将字符 < U+0080 编码为单个字节,将字符 > U+0100 编码为两字节大端序。一般来说,这是不可解码的。两个换行符 (U+000A, U+000A) 将具有与 GURMUKHI LETTER UU (U+0A0A) 相同的编码。

没有调用iconv它会为你解码它;您要么需要根据字符范围或文件中的顺序采用您所知道的启发式方法来编写自定义解码器(或要求使用标准编码的另一个副本)。

于 2013-04-02T13:04:15.993 回答
1

我认为最终这是我自己的错,不知何故。浏览此文件显示原始 UTF-16 编码文件的版本非常混乱和损坏;浏览器中的“另存为”菜单然后保存了为该线程创建初始问题的损坏文件。

似乎网络浏览器试图显示该 UTF-16 编码文件,删除诸如 \x00 之类的不可打印字符并将其他一些字符转换为 UTF-8,从而完全破坏了原始文件。

使用wget来获取文件解决了这个问题,我可以很好地将它转换为 UTF-8 并进一步使用它。

于 2013-04-05T12:08:30.630 回答