gpt4 book ai didi

python - 在 Python 3 中,计算泰语字符的位置

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:51 24 4
gpt4 key购买 nike

首先,我使用了 Python 3 grapheme库来解决我的问题。 (有关字素的更多信息,请参阅 this article)。但令我惊讶的是,如果没有专门的库,Python 3 无法做到这一点......


我求助于 grapheme 因为在多次网络搜索和阅读 StackOverflow 问题后,我无法让 Python 3 返回序列中正确数量的字符位置泰国字符。

例如,这是一个 UTF-8 泰文字符串:

thai_str = 'สีโชคดีเป็นสีชมพู สีโชคร้ายเป็นสีเหลืองและขาว'

我使用术语字符位置 来标识泰文字符行/字符串中的单个位置。这是因为字符位置可能由泰语辅音加上(在某些情况下)辅音上方或下方的元音或声调标记组成。辅音加上上面/下面的元音或声调标记在 Unicode 字符串中占据一个字符位置。 (一些泰语辅音可能在其左侧、右侧或两者都有元音。这些元音占据它们自己的字符位置。)

例如,在从示例字符串生成的以下序列中,第 2 项和第 7 项是元音,第 10 项是声调标记。每个使用 UTF-8 字符串中的单独字节,但不占用自己的字符位置。第 3 项和第 8 项是位于辅音左侧的元音,因此占据字符位置。

01: ส
02: ี
03: โ
04: ช
05: ค
06: ด
07: ี
08: เ
09: ป
10: ็
...
45: ว

当尝试确定示例字符串中的字符位置时,len(thai_str) 返回 45。这是不正确的。我能够获得正确数量的字符位置的唯一方法是使用 grapheme.length(thai_str) 来获得 35

我还使用了编码来获得以下内容:

b'\xe0\xb8\xaa\xe0\xb8\xb5\xe0\xb9\x82\xe0\xb8\x8a\xe0\xb8\x84\xe0\xb8\x94...

(计算似乎在每个泰语字符之前的 xe0 的实例感觉不是正确的方法...)

SO - 计算我的示例字符串中字符位置的唯一方法是使用 Python 3 库(例如 grapheme)吗?

最佳答案

这不是唯一的方法,如果你想自己实现一个字素计数器,但它很复杂,你必须咨询https://unicode.org规范以使其正确。

thai_str 不是UTF-8字符串,而是包含Unicode码位的Unicode字符串。有不同的categories代码点。计算字符位置所需的示例文本使用的两个类别是:

  • Lo Other_Letter,其他字母,包括音节和表意文字;
  • Mn Nonspacing_Mark,一个非间距组合标记(零前进宽度)。

如果您不计算代码点的 Nonspacing_Mark (Mn) 类别,您可以大致了解字素库在做什么:

import unicodedata as ud

thai_str = 'สีโชคดีเป็นสีชมพู สีโชคร้ายเป็นสีเหลืองและขาว'

for cp in thai_str:
print(f'{cp}\t{ud.category(cp)}\t{ud.name(cp)}')

print(sum(1 for cp in thai_str if ud.category(cp)[0] != 'M'))

输出:

ส   Lo  THAI CHARACTER SO SUA
ี Mn THAI CHARACTER SARA II
โ Lo THAI CHARACTER SARA O
ช Lo THAI CHARACTER CHO CHANG
ค Lo THAI CHARACTER KHO KHWAI
ด Lo THAI CHARACTER DO DEK
ี Mn THAI CHARACTER SARA II
เ Lo THAI CHARACTER SARA E
ป Lo THAI CHARACTER PO PLA
็ Mn THAI CHARACTER MAITAIKHU
...
ว Lo THAI CHARACTER WO WAEN
35

关于python - 在 Python 3 中,计算泰语字符的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54263419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com