按字母索引字符串,包括变音符号

Index strings by letter including diacritics

我不确定如何表述这个问题,但我正在寻找一个神奇的函数来生成这段代码

for x in magicfunc("H̶e̕l̛l͠o͟ ̨w̡o̷r̀l҉ḑ!͜"):
    print(x)

像这样:

H̶
e̕
l̛
l͠
o͟
 ̨
w̡
o̷
r̀
l҉
ḑ
!͜

基本上,是否有一个内置的 unicode 函数或方法,它接受一个字符串并为每个字形输出一个数组,以及它们各自的 unicode 装饰器和变音符号等?与文本编辑器将光标移动到下一个字母而不是迭代所有组合字符的方式相同。

如果没有,我会自己写函数,不需要帮助。只是想知道它是否已经存在。

您可以使用 unicodedata.combining 来确定字符是否正在组合:

def combine(s: str) -> Iterable[str]:
  buf = None
  for x in s:
    if unicodedata.combining(x) != 0:
      # combining character
      buf += x
    else:
      if buf is not None:
        yield buf
      buf = x
  if buf is not None:
    yield buf

结果:

>>> for x in combine("H̶e̕l̛l͠o͟ ̨w̡o̷r̀l҉ḑ!͜"):
...     print(x)
... 
H̶
e̕
l̛
l͠
o͟
 ̨
w̡
o̷
r̀
l

ḑ
!͜

问题是 COMBINING CYRILLIC MILLIONS SIGN 未被识别为组合,不知道为什么。您还可以测试 COMBINING 是否在字符的 unicodedata.name(x) 中,这应该可以解决它。

第3方regex模块可以按字形搜索:

>>> import regex
>>> s="H̶e̕l̛l͠o͟ ̨w̡o̷r̀l҉ḑ!͜"
>>> for x in regex.findall(r'\X',s):
...  print(x)
...
H̶
e̕
l̛
l͠
o͟
 ̨
w̡
o̷
r̀
l҉
ḑ
!͜