【发布时间】:2026-02-12 02:20:05
【问题描述】:
我不确定我的命名是否正确,所以请纠正我:)
我收到了一个代表巴利语词典的文本文件:由换行符 \n (0x0a) 字符分隔的单词列表。据说有些特殊字母是用 UTF-8 编码的,但我对此表示怀疑。
将此文本文件加载到我的任何编辑器(vim、记事本、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 脚本,但认为有一种更简单的方法可以完成这项工作。似乎this 是解决此问题的有用链接,但是没有可以完成此操作的工具吗?我错过了什么吗?
编辑: 只是为了让事情更有趣,似乎也散布着实际的 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 字节的“压缩”?
【问题讨论】:
-
是的,这显然不是 UTF-8。如果那确实是“ṭhiti”,那么在我看来,它不像任何理智的 Unicode 编码。
-
您可以尝试将每个以 > 127 字节开头的 2 字节序列解释为 Unicode 代码点。但这充其量只是一个粗略的编码方案。如果您可以向我们展示更多的 hexdump(连同预期的文本),我们可能会在那里找到一个模式。
-
@JoachimSauer 它甚至不适用于给出的示例......
-
@R.MartinhoFernandes: 哦!对...
-
@Joni:确实如此。请参阅我对 Joachim 的回答。另一种方法是在我怀疑它们丢失的地方插入所有 \x00 字节,即在每个 [a-zA-Z] ...