RBV*_*RBV 3 python unicode python-3.x thai grapheme
第一,我使用了Python 3字形库,以解决我的问题。(有关grapheme 的更多信息,请参阅本文)。但令我惊讶的是,如果没有专门的库,Python 3 无法做到这一点......
我使出字形,因为经过多次网络搜索和StackOverflow的问题阅读,我不能让Python 3里返回正确数量的字符位置在泰国字符的序列。
例如,这是一个 UTF-8 泰语字符串:
thai_str = '????????????????? ???????????????????????????'
Run Code Online (Sandbox Code Playgroud)
我使用术语字符位置来标识泰语字符行/字符串中的单个位置。这是因为字符位置可能由泰语辅音加上,在某些情况下,辅音上方或下方的元音或声调标记组成。辅音加上上方/下方的元音或声调标记在 Unicode 字符串中占据单个字符位置。(一些泰语辅音也可能在左边、右边或两者都有元音。这些元音占据他们自己的字符位置。)
例如,在从示例字符串生成的以下序列中,项目 2 和 7 是元音,项目 10 是音调标记。每个使用 UTF-8 字符串中的单独字节,但不占用自己的字符位置。第 3 项和第 8 项是元音,位于辅音左侧,因此占据字符位置。
01: ?
02: ?
03: ?
04: ?
05: ?
06: ?
07: ?
08: ?
09: ?
10: ?
...
45: ?
Run Code Online (Sandbox Code Playgroud)
尝试确定示例字符串中的字符位置时,len(thai_str)返回45. 这是不正确的。我能够获得正确数量的字符位置的唯一方法是使用grapheme.length(thai_str)get 35。
我还使用了 encode来获得以下内容:
b'\xe0\xb8\xaa\xe0\xb8\xb5\xe0\xb9\x82\xe0\xb8\x8a\xe0\xb8\x84\xe0\xb8\x94...
Run Code Online (Sandbox Code Playgroud)
(计算xe0每个泰语字符之前的实例似乎不是正确的方法......)
SO - 在我的示例字符串中计算字符位置的唯一方法是使用 Python 3 库,例如grapheme吗?
如果您想自己实现一个字素计数器,这不是唯一的方法,但它很复杂,您必须查阅https://unicode.org规范才能正确使用。
thai_str不是 UTF-8 字符串,而是包含 Unicode 代码点的 Unicode 字符串。有不同类别的代码点。计算字符位置所需的示例文本使用的两个类别是:
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'))
Run Code Online (Sandbox Code Playgroud)
输出:
? 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
426 次 |
| 最近记录: |