在很多情况下,用户的语言不是“latin”脚本(示例包括:希腊语、俄语、中文)。在大多数情况下,排序是通过
完成的或者更具体地说明其余的...:
可以根据脚本选择排序吗?
示例1:首先是中文文字,然后是拉丁语-希腊语-阿拉伯语(甚至更多......)
示例2:首先是希腊字母,然后是拉丁-阿拉伯-中文(甚至更多......)
创建此类排序的最有效且Python式的方法是什么? (“any”我的意思是“简单”“首先选择的脚本”并按unicode排序,或者更复杂的“首先选择的脚本”,然后是其余脚本的指定顺序) 有趣的问题。这是一些对字符串进行分类的示例代码 根据第一个字符的书写系统。
在此示例中,我对平假名和片假名(这两个日语 音节)处于同一级别,这意味着纯片假名字符串将 总是出现在纯平假名字符串之后。如果我们想对它们进行排序 相同的音节(例如,に和ni)排序在一起,那就是 更棘手。
一个老问题,但我想提供一种利用 PyICU 和 ICU4C 的替代方法。
Unicode 对 BCP47 有两个扩展,允许控制或覆盖排序规则的各个方面。具体来说,
-u-kr-
允许在排序规则内重新排序脚本。您指定一个由连字符分隔的四个字母 ISO 15924 脚本代码列表。这将控制脚本顺序的排序。
使用 BCP-47 语言标签创建区域设置。在这种情况下,我将使用
und-u-kr-Adlm-Hans-Ethi-Latn
。 und
undefined,它不代表特定的语言。它将使用根排序规则。我本可以使用
en-u-kr-Adlm-Hans-Ethi-Latn
,因为 English 也使用根排序规则。
langauge 标签指定排序 Adlam,然后是简体中文,然后是埃塞俄比亚文字,然后是拉丁文。所有其他脚本均按根排序规则中的顺序排序。
import icu
locale = icu.Locale.forLanguageTag('und-u-kr-Adlm-Hans-Ethi-Latn')
collator = icu.Collator.createInstance(locale)
languages = ['𞠗𞢱𞡓𞠣', 'नेपाली','ꛀꛣꚧꚳ','白语','ማርኛ','français', '𞤊𞤵𞥅𞤼𞤢 𞤔𞤢𞤤𞤮𞥅']
print(sorted(languages))
# ['français', 'नेपाली', 'ማርኛ', '白语', 'ꛀꛣꚧꚳ', '𞠗𞢱𞡓𞠣', '𞤊𞤵𞥅𞤼𞤢 𞤔𞤢𞤤𞤮𞥅']
print(sorted(languages, key=collator.getSortKey))
# ['𞤊𞤵𞥅𞤼𞤢 𞤔𞤢𞤤𞤮𞥅', '白语', 'ማርኛ', 'français', 'नेपाली', 'ꛀꛣꚧꚳ', '𞠗𞢱𞡓𞠣']