【问题标题】:Convert Unicode code point to UTF-8 sequence将 Unicode 代码点转换为 UTF-8 序列
【发布时间】: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] ...

标签: unicode utf-8


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 也感谢乔的确认 :) 是的,这应该是巴利语单词“ṭhiti”。请参阅上面的回答,了解我认为我会对此做些什么......
    • 是的,在每个 [\na-zA-Z] 之前插入 \x00 并按原样输出接下来的两个字节将是很好的第一步。这可以通过iconv -f utf-16be -t utf-8 传输并检查异常。