我正在尝试解析包含用
.docx
编写的印地语文本的 Word 文件 KrutiDev 010 font
。
当我使用 Python 处理文本并尝试将其编码为 JSON 时,我得到随机的 乱码 而不是预期的印地语文本。
这是我到目前为止所做的:
我在
ensure_ascii=False
函数中使用 json.dump()
参数来允许 Unicode 编码,因为 Python 的 JSON
编码器默认使用 ASCII。
尽管如此,输出仍然不正确,并且无法正确显示 Hindi 文本。
我怀疑这个问题与
KrutiDev
字体有关。
当我将乱码放入此转换器时,它会给出正确的印地语文本:
如何正确解析 KrutiDev
字体中的
Hindi文本并将其编码为 Unicode 并保存在 JSON 文件中?
是否有任何 Python 库或方法可以有效处理此类
font-specific
编码?
特别针对 KrutiDev,请查看 Unicode_KrutiDev_converter.py。我不确定支持哪个版本的 KrutiDev。每个版本的字体之间的映射似乎略有变化。
一个更通用但更具挑战性的方法是使用palaso-python,这需要从github安装,它在PyPi上不可用。可用的文档有限,除了需求文件之外,没有任何有关依赖项的信息。我假设您的系统上需要同时提供 icu4c 和 teckit。 Teckit 应用程序和库适用于 Windows、Linux 和 macOS:https://software.sil.org/teckit/#downloads。
您需要下载 KrutiDev 010 [映射文件](https://github.com/silnrsi/wsresources/tree/master/scripts/Deva/legacy/kruti-dev-010/mappings。有两个文件:
KrutiDev010.map
- 映射的源文件KrutiDev010.tec
- 映射的编译版本。这就是您需要的。安装palaso-python:
pip install -U git+https://github.com/silnrsi/palaso-python.git
然后:
# import teckit python wrapper
from palaso.teckit.engine import *
# create mapping with compiled teckit mapping file. I have it in my cwd, specify path to file, as required.
m = Mapping('KrutiDev011.tec')
# create converters in each direction
# dec = forward direction (KrutiDev to Unicode)
# enc = reverse direction (Unicode string to KrutiDev)
dec = Converter(m); enc = Converter(m, forward=False)
将转换器的方向视为编码和解码。 KrutiDev010 是传统编码到 Unicode 的转换,相反方向是 Unicode 到 KrutiDev。
因此
dec
将类似于 bytes.decode()
操作,并且 enc
将相当于 str.encode()
操作。这意味着 dec
需要传统编码中的字节序列并输出 Python3 字符串。而 enc
则采用 Python3 字符串并输出传统编码中的字节序列。
如果您将 KrutiDev 文本作为字节序列,一切都很好,如果不是,您需要将字符串转换为字节:
kds = 'fgUnh'
kdb = kds.encode('latin1')
然后将字节解码为 Unicode 字符串:
uni = dec.convert(kdb, finished=True)
print(uni)
# हिन्दी
此时请注意,编码转换在 cautian 方面出错,它引入了一个可能需要也可能不需要的字符。它不影响字符串的显示。字符串
uni
由代码点 0939 093F 0928 094D 200D 0926 0940
组成。在这种情况下不需要 U+200D(零宽度连接器),但有时有必要使用。
在这个例子中它可以被剥离掉。在数据处理中可以根据需求进行系统替换。
因此要全局替换:
# uni = dec.convert(kdb, finished=True)
使用
enc
转换为旧编码:
print(enc.convert(uni, finished=True))
# b'fgUnh'
print(kdb == enc.convert(uni, finished=True))
# True
或者,如果您使用的是 Windows,更简单的方法是将 Word 文档原位转换为 Unicode。 teckit 的开发人员还有一个 Word 插件 SIL Converters,可用于将 Word 文档本身转换为 Unicode。