>>>2 这封信来自一个单词:ἐ̣ν̣τ̣-6ren">
gpt4 book ai didi

python-3.x - Python3 和组合变音符号

转载 作者:行者123 更新时间:2023-12-02 01:50:32 25 4
gpt4 key购买 nike

我在 python3 中遇到了 Unicode 问题,我似乎无法理解为什么会发生这种情况。

symbol= "ῇ̣"
print(len(symbol))
>>>>2

这封信来自一个单词:ἐ̣ν̣τ̣ῇ̣[αὐτ]ῇ,我在其中组合了变音符号。我想在Python 3中进行统计分析并将结果存储在数据库中,问题是我还将字符的位置(索引)存储在文本中。数据库应用程序正确地将示例中的符号变量计为一个字符,而 Python 将其计为两个字符 - 丢掉了整个索引。

该项目要求我保留变音符号,因此我不能简单地忽略它们或在字符串上执行 .replace("combining 变音符号","")

由于 Python3 将 unicode 作为字符串的默认值,我对此感到有点困惑。

我尝试使用 Greek-accentuation: https://pypi.org/project/greek-accentuation/ 中的 base()strip()strip_length() 方法,但是这也没有帮助。

项目要求是:

  • 检测属于该字符的字母表(OK)
  • 存储字符串位置(在数据库中突出显示所需)(不OK)
  • 能够处理混合在一个字符串中的多种语言/字母。 (好的)
  • 迭代 CSV 输入。 (好的)
  • 忽略一组预定义字符串(确定)
  • 忽略匹配特定条件的字符串集(确定)

这是该项目的简化代码:

# -*- coding: utf-8 -*-
import csv
from alphabet_detector import AlphabetDetector
ad = AlphabetDetector()
with open("tbltext.csv", "r", encoding="utf8") as txt:
data = csv.reader(txt)
for row in data:
text = row[1]
### Here I have some string manipulation (lowering everything, replacing the predefined set of strings by equal-length '-',...)
###then I use the ad-module to detect the language by looping over my characters, this is where it goes wrong.
for letter in text:
lang = ad.detect_alphabet(letter)

如果我使用单词:ἐ̣ν̣τ̣ῇ̣[αὐτ]ῇ作为for循环的示例;我的结果是:

>>> word = "ἐ̣ν̣τ̣ῇ̣[αὐτ]ῇ"
>>> for letter in word:
... print(letter)
...

̣
ν
̣
τ
̣

̣
[
α

τ
]

如何让 Python 将带有组合变音标记的字母视为一个字母,而不是使其分别打印字母和变音标记?

最佳答案

该字符串的长度为 2,因此这是正确的:两个代码点:

>>> list(hex(ord(c)) for c in symbol)
['0x1fc7', '0x323']
>>> list(unicodedata.name(c) for c in symbol)
['GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI', 'COMBINING DOT BELOW']

所以你不应该使用len来计算字符数。

您可以计算不组合的字符,因此:

>>> import unicodedata
>>> len(''.join(ch for ch in symbol if unicodedata.combining(ch) == 0))
1

来自:How do I get the "visible" length of a combining Unicode string in Python? (但我把它移植到了python3)。

但这也不是最佳解决方案,具体取决于计算字符的范围。我认为在你的情况下这已经足够了,但是字体可以将字符合并为连字。在某些语言中,这些字符在视觉上是新的(并且非常不同)的字符(与西方语言中的连字不同)。

作为最后的评论:我认为你应该规范化字符串。使用上面的代码,在这种情况下没关系,但在其他情况下,您可能会得到不同的结果。特别是如果有人使用战斗性字符(例如,单位为 mu,或 Eszett,而不是真正的希腊字符)。

关于python-3.x - Python3 和组合变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782110/

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