如何使用Python在json中解析包含KrutiDev字体的印地语文本的Word文件

问题描述 投票:0回答:1

我正在尝试解析包含用

.docx
编写的印地语文本的 Word 文件
KrutiDev 010 font
。 当我使用 Python 处理文本并尝试将其编码为 JSON 时,我得到随机的 乱码 而不是预期的印地语文本。

这是我到目前为止所做的:

  1. 我在

    ensure_ascii=False
    函数中使用
    json.dump()
    参数来允许 Unicode 编码,因为 Python 的
    JSON
    编码器默认使用 ASCII

  2. 尽管如此,输出仍然不正确,并且无法正确显示 Hindi 文本。

我怀疑这个问题与

KrutiDev
字体有关。 当我将乱码放入此转换器时,它会给出正确的印地语文本:

krutidev 到 unicode 转换器

如何正确解析 KrutiDev 字体中的

Hindi
文本并将其编码为 Unicode 并保存在 JSON 文件中?

是否有任何 Python 库或方法可以有效处理此类

font-specific
编码?

python json encoding fonts hindi
1个回答
0
投票

特别针对 KrutiDev,请查看 Unicode_KrutiDev_converter.py。我不确定支持哪个版本的 KrutiDev。每个版本的字体之间的映射似乎略有变化。

一个更通用但更具挑战性的方法是使用palaso-python,这需要从github安装,它在PyPi上不可用。可用的文档有限,除了需求文件之外,没有任何有关依赖项的信息。我假设您的系统上需要同时提供 icu4cteckitTeckit 应用程序和库适用于 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。有两个文件:

  1. KrutiDev010.map
    - 映射的源文件
  2. 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。

© www.soinside.com 2019 - 2024. All rights reserved.