我有以下组合变音符号字符
[ọ́,å,̣,é
。当在类似的字符串中通过字符串索引访问它们时,我希望将它们保持为一个字符
"奥̣r;
例如,当前拆分为:
s = "ọ̀rẹ̀"
s[0] = ò
s[1] = .
s[2] = r
s[3] = è
s[4] = .
如何使s[0]和s[1]为一个字符,而不是原始字符串中的两个字符?
有什么想法如何在python中完成这项工作吗?
一个解决方案。
import unicodedata
def combinedchars(string):
result = []
for char in string:
if unicodedata.combining(char):
result[-1] += char
else:
result.append(char)
return(result)
s = "Borbá̭ra̭"
print(list(s))
给出
['B', 'o', 'r', 'b', 'á', '̭', 'r', 'a', '̭']
将变音标记组合为分开的字符。
2.
print(combinedchars(s))
给出所需的输出
['B', 'o', 'r', 'b', 'á̭', 'r', 'a̭']
处理将变音标记与前面的字符组合在一起。
事实是,许多拉丁脚本语言的字母不能用一个预先组合的字符表示。例如";ọÉrẹÉ"将需要至少五个unicode代码点。
取第一个字母ọÉ,可以表示为以下字符序列:U+00F2 U+0323
、U+1ECD U+0300
、U+006F U+0323 U+0300
和U+006F U+0300 U+0323
。所有这些序列在规范上是等价的。
当使用不能完全由预编译字符表示的语言时,有必要:
- 对所有文本进行规范化,以确保所有文本都在一个单一的规范化形式中,即NFC或NFD
- 使用扩展的字形簇而不是字符
理解字形的一个简单方法是将其视为该语言的用户对单个字母的看法ọÉ不会被认为是一个由两个或三个字符组成的序列,而是一个单一的单元。
如果我们将它们视为单个字符:
import unicodedataplus as ud
# normalise to retain consistent representation with data
s = ud.normalize("NFC", "ọ̀rẹ̀")
characters = list(s)
print(len(characters))
# 5
print(characters)
# ['ọ', '̀', 'r', 'ẹ', '̀']
但如果我们用字形代替:
import regex
graphemes = regex.findall(r'X', s)
print(len(graphemes))
# 3
print(graphemes)
# ['ọ̀', 'r', 'ẹ̀']
X
是表示单个字形的正则表达式元字符。re中不支持此元字符,因此必须使用regex或pyicu模块。
因此,对于约鲁巴语和其他各种语言,最好构建在字形级别而不是字符级别上操作的函数和类。
如果您想从列表字符创建字符串,只需使用join
方法
x = ['ọ́', 'ọ̀', 'ẹ̀', 'ẹ́']
print("".join(x))