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

标签 unicode utf-8

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

我收到了一个表示巴利语词典的文本文件:由换行符 \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 编码,“ñ”由具有 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),但这不是巴利语字符 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 字节的“压缩”?

最佳答案

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

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

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

关于unicode - 将 Unicode 代码点转换为 UTF-8 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15764478/

相关文章:

utf-8 - GLIB UTF16BE 和 UTF-16BE 之间的区别以及如何支持 UTF16BE

c++ - 为什么 mbstowcs 返回 "invalid multibyte character"

php - json_encode utf8

c++ - std::wstring 导致堆内存分配崩溃

c++ - 使用 API WideChartoMultibyte 将日语字符从宽字符转换为多字节给出 '????'

Python 2.7 : 'ascii' codec can't encode character u'\xe9' error while writing in file

php - Zend Framework - 本地主机上的 utf8 正常 - 网络服务器上的 utf8 失败

java - UTF-8 编码不适用于 Eclipse Java 应用程序

C# 按钮文本 Unicode 字符

java - 检测 Java 中的任何组合字符