【发布时间】:2019-07-13 21:26:09
【问题描述】:
我在 python3 中遇到了 Unicode 问题,我似乎无法理解为什么会这样。
symbol= "ῇ̣"
print(len(symbol))
>>>>2
这封信来自一个词:ἐ̣ν̣τ̣ῇ̣[αὐτ]ῇ,其中我结合了变音符号。我想在 Python 3 中进行统计分析并将结果存储在数据库中,问题是我还将字符的位置(索引)存储在文本中。数据库应用程序正确地将示例中的符号变量计为一个字符,而 Python 将其计为两个 - 丢弃了整个索引。
该项目要求我保留变音符号,因此我不能简单地忽略它们或在字符串上添加.replace("combining diacritical mark","")。
由于 Python3 将 unicode 作为字符串的默认设置,我对此有点傻眼。
我尝试使用来自希腊口音的base()、strip() 和strip_length() 方法:https://pypi.org/project/greek-accentuation/,但这也无济于事。
项目要求是:
- 检测属于字符的字母表(OK)
- 存储字符串位置(需要在数据库中突出显示)(NotOK)
- 能够处理混合在一个字符串中的多种语言/字母。 (好的)
- 遍历 CSV 输入。 (好的)
- 忽略一组预定义的字符串 (OK)
- 忽略符合特定条件的字符串集(OK)
这是该项目的简化代码:
# -*- 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)
如果我使用这个词:ἐ̣ν̣τ̣ῇ̣[αὐτ]ῇ 作为 forloop 的示例;我的结果是:
>>> word = "ἐ̣ν̣τ̣ῇ̣[αὐτ]ῇ"
>>> for letter in word:
... print(letter)
...
ἐ
̣
ν
̣
τ
̣
ῇ
̣
[
α
ὐ
τ
]
ῇ
如何让 Python 将带有组合变音标记的字母视为一个字母,而不是让它分别打印字母和变音标记?
【问题讨论】:
-
我忘了把这个添加到我原来的问题中:这里是为 Ruby 描述的一个类似问题,但我找不到与提到的 UnicodeUtils.eachGrapheme() 方法相同的 Python 模型:@ 987654322@
-
看起来很适合python bug tracker
-
@AzatIbrakov:不,2 是正确的行为
-
@Clueless_captain 你可以edit你的帖子。
标签: python-3.x unicode diacritics