带有抑扬符的组合字符序列
sequence of combination character with circumfrex
我有一份包含以下句子的文件。
“我的朋友们”
我通过 QTextCursor 获取每个字符。
from PySide6 import QtWidgets, QtGui
import os, sys, PySide6
dirname = os.path.dirname(PySide6.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
doc = QtGui.QTextDocument()
step = 0
doc.setPlainText("Mon frère aîné")
for num, sen in enumerate("Mon frère aîné"):
tc = QtGui.QTextCursor(doc)
can_move = tc.movePosition(tc.NextCharacter, tc.MoveAnchor, step+1)
if can_move:
tc.movePosition(tc.PreviousCharacter, tc.KeepAnchor, 1)
print(tc.selectedText(), num, sen)
step += 1
结果:
M 0 M
o 1 o
n 2 n
3
f 4 f
r 5 r
è 6 è
r 7 r
e 8 e
9
一个 10 个
î 11 i(此处)
n 12 ̂(此处)
é 13 n(此处)
QTextCursor 可以像组合 unicode "î" 一样得到两个字符作为一个字符,
另一方面,python序列区分“i”和“^”之间的两者。
怎么才能让两者重合呢?
字形 î
在 Unicode 中可以用两种方式表示:
U+00EE - LATIN SMALL LETTER I WITH CIRCUMFLEX
或:
U+0069 - LATIN SMALL LETTER I
U+0302 - COMBINING CIRCUMFLEX ACCENT
QTextCursor
似乎是 Unicode 字素感知的,并且一次推进一个“感知字符”。有关详细信息,请参阅 Unicode Text Segmentation。
在这种情况下,Unicode 规范化可以在两者之间进行转换,可能就是您所需要的:
import unicodedata as ud
s1 = '\u00ee'
s2 = '\u0069\u0302'
print(s1,s2) # They look the same
print(len(s1),len(s2))
print(s1 == s2)
print(s1 == ud.normalize('NFC',s2)) # combined format
print(ud.normalize('NFD',s1) == s2) # decomposed format
输出:
î î
1 2
False
True
True
在你的例子中,一些重音字符被组合,一个被分解:
text = "Mon frère aîné"
print(len(text),text,ascii(text))
text = ud.normalize('NFC',text)
print(len(text),text,ascii(text))
text = ud.normalize('NFD',text)
print(len(text),text,ascii(text))
输出:
15 Mon frère aîné 'Mon fr\xe8re ai\u0302n\xe9' # mix
14 Mon frère aîné 'Mon fr\xe8re a\xeen\xe9' # shorter, all combined
17 Mon frère aîné 'Mon fre\u0300re ai\u0302ne\u0301' # longer, all decomposed
QTextCursor
我有一份包含以下句子的文件。 “我的朋友们” 我通过 QTextCursor 获取每个字符。
from PySide6 import QtWidgets, QtGui
import os, sys, PySide6
dirname = os.path.dirname(PySide6.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
doc = QtGui.QTextDocument()
step = 0
doc.setPlainText("Mon frère aîné")
for num, sen in enumerate("Mon frère aîné"):
tc = QtGui.QTextCursor(doc)
can_move = tc.movePosition(tc.NextCharacter, tc.MoveAnchor, step+1)
if can_move:
tc.movePosition(tc.PreviousCharacter, tc.KeepAnchor, 1)
print(tc.selectedText(), num, sen)
step += 1
结果: M 0 M
o 1 o
n 2 n
3
f 4 f
r 5 r
è 6 è
r 7 r
e 8 e
9
一个 10 个
î 11 i(此处)
n 12 ̂(此处)
é 13 n(此处)
QTextCursor 可以像组合 unicode "î" 一样得到两个字符作为一个字符, 另一方面,python序列区分“i”和“^”之间的两者。
怎么才能让两者重合呢?
字形 î
在 Unicode 中可以用两种方式表示:
U+00EE - LATIN SMALL LETTER I WITH CIRCUMFLEX
或:
U+0069 - LATIN SMALL LETTER I
U+0302 - COMBINING CIRCUMFLEX ACCENT
QTextCursor
似乎是 Unicode 字素感知的,并且一次推进一个“感知字符”。有关详细信息,请参阅 Unicode Text Segmentation。
在这种情况下,Unicode 规范化可以在两者之间进行转换,可能就是您所需要的:
import unicodedata as ud
s1 = '\u00ee'
s2 = '\u0069\u0302'
print(s1,s2) # They look the same
print(len(s1),len(s2))
print(s1 == s2)
print(s1 == ud.normalize('NFC',s2)) # combined format
print(ud.normalize('NFD',s1) == s2) # decomposed format
输出:
î î
1 2
False
True
True
在你的例子中,一些重音字符被组合,一个被分解:
text = "Mon frère aîné"
print(len(text),text,ascii(text))
text = ud.normalize('NFC',text)
print(len(text),text,ascii(text))
text = ud.normalize('NFD',text)
print(len(text),text,ascii(text))
输出:
15 Mon frère aîné 'Mon fr\xe8re ai\u0302n\xe9' # mix
14 Mon frère aîné 'Mon fr\xe8re a\xeen\xe9' # shorter, all combined
17 Mon frère aîné 'Mon fre\u0300re ai\u0302ne\u0301' # longer, all decomposed
QTextCursor