将Unicode代码点转换为UTF-8序列

时间:2013-04-02 12:46:17

标签: unicode utf-8

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

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

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

mhiti

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

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

在我看来,Unicode代码点U+1E6D(“ṭ”或LATIN SMALL LETTER T WITH DOT BELOW)。该特定字母具有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),但这不是Pāli字符AFAIK;然后是一个“7”,一句话没有意义。然后Unicode代码点U + 1E37是“ḷ”(UTF-8 \ xe1b8b7),它是有效的Pāli字符。但这会留下第一个字节\ x01本身。如果我不得不猜我会认为这是名字“Jīvaka”,但这与字节不匹配。 稍后:根据作者的说法,这是“Āḷāvaka” - 所以假设从上面进行字符编码的启发式,再次缺少\ x00。将其添加回

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我认为最终这是我自己的错,不知何故。浏览this file显示原始UTF-16编码文件的版本严重破损;浏览器中的“另存为”菜单随后保存了该文件的破解文件,该文件为该主题创建了初始问题。

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

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