1

我有一个带有以下句子的文件。“Mon frère aîné”我通过 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" 和 "^" 之间的两个字符。

我怎样才能使两者之间发生巧合?

4

1 回答 1

2

字形î在 Unicode 中可以用两种方式表示:

U+00EE - LATIN SMALL LETTER I WITH CIRCUMFLEX

或者:

U+0069 - LATIN SMALL LETTER I
U+0302 - COMBINING CIRCUMFLEX ACCENT

QTextCursor似乎是 Unicode 字形感知并一次推进一个“感知字符”。有关更多详细信息,请参阅Unicode 文本分割

在这种情况下,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

于 2021-11-08T07:24:02.227 回答