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

将Unicode代码点转换为UTF-8序列,unicode,utf-8,Unicode,Utf 8,我不确定我的命名是否正确,所以请纠正我:) 我收到了一个表示pāli字典的文本文件:由新行\n(0x0a)字符分隔的单词列表。据推测,一些特殊字母是用UTF-8编码的,但我对此表示怀疑 例如,将此文本文件加载到我的任何编辑器(vim、记事本、TextEdit等)中都会显示非常混乱的文本 mhiti 仔细查看实际字节,然后发现以下内容(使用hextump-C) 在我看来,这似乎是Unicode代码点U+1E6D(“ṭ" 或带点的拉丁文小写字母T)。该特定字母采用UTF-8编码e1 b9 ad 我

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

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

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

mhiti
仔细查看实际字节,然后发现以下内容(使用
hextump-C

在我看来,这似乎是Unicode代码点
U+1E6D
(“ṭ" 或带点的拉丁文小写字母T)。该特定字母采用UTF-8编码
e1 b9 ad

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

编辑:为了让事情更有趣一点,似乎还有一些实际的UTF-8编码字符散布在各处

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编码,“ñ”由具有Unicode代码点U-00F1的UTF-8序列\xc3b1编码

编辑:这里有一个我不太清楚它应该是什么:

01 1e 37 01 01 76 61 6b 61
?        ā     v  a  k  a
我只能猜测,但这也没有意义。Unicode代码点U+011e是一个“Ğ”(UTF-8\xc49e),但那不是一个pāli字符;然后是一个“7”,在一个词中没有意义。然后Unicode代码点U+1E37是一个“1”ḷ“(UTF-8\xe1b8b7)这是一个有效的Pāli字符。但这会留下第一个字节\x01本身。如果我不得不猜测,我会认为这是名称“Jīvaka”,但与字节不匹配。稍后:根据作者的说法,这是“Jīvaka”ḷāvaka”-因此,假设从上面开始字符编码的启发式,再次缺少\x00。将其添加回

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

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

在本文中,我假设“”作为该文件的内容是有意义的

从您的描述来看,该文件似乎将U+0100的字符编码为双字节大端。通常,这是不可解码的;两个换行符(U+000A,U+000A)的编码方式与古穆基字母UU(U+0A0A)相同


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

在此上下文中,我假设“作为该文件的内容是有意义的”

从您的描述来看,该文件似乎将U+0100的字符编码为双字节大端。通常,这是不可解码的;两个换行符(U+000A,U+000A)的编码方式与古穆基字母UU(U+0A0A)相同


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

我想最终这是我自己的错。浏览到显示了原始UTF-16编码文件的一个非常损坏的版本;然后浏览器的“另存为”菜单保存了该损坏的文件,该文件创建了该线程的初始问题

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


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

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

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


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

是的,这显然不是UTF-8。如果确实如此”ṭ在我看来,它不像任何健全的Unicode编码。您可以尝试将每个以字节>127开头的2字节序列解释为Unicode码点。但这充其量只是一个粗略的编码方案。如果您能向我们展示更多的hextump(以及预期的文本),我们可能会在那里找到一种模式。@JoachimSauer,它甚至不适用于给出的示例。…。@R.MartinhoFernandes:D'oh!对…@乔尼:是的。看看我对约阿希姆的回答。另一种方法是插入我怀疑丢失的所有\x00字节,即在每个[a-zA-Z]之前……是的,这显然不是UTF-8。如果确实如此”ṭ在我看来,它不像任何健全的Unicode编码。您可以尝试将每个以字节>127开头的2字节序列解释为Unicode码点。但这充其量只是一个粗略的编码方案。如果您能向我们展示更多的hextump(以及预期的文本),我们可能会在那里找到一种模式。@JoachimSauer,它甚至不适用于给出的示例。…。@R.MartinhoFernandes:D'oh!对…@乔尼:是的。看看我对约阿希姆的回答。另一种方法是插入所有\x00字节
01 00 1e 37 01 01 76 61 6b 61
Ā     ḷ     ā     v  a  k  a