以下是我如何在不使用 PyICU 的情况下正确地排序波斯语(使用 Python 3.x):
首先设置区域设置(别忘了导入 locale 和 platform)
if platform.system() == 'Linux':
locale.setlocale(locale.LC_ALL, 'fa_IR.UTF-8')
elif platform.system() == 'Windows':
locale.setlocale(locale.LC_ALL, 'Persian_Iran.1256')
else:
pass (or any other OS)
然后使用 key 排序:
a = ['ا','ب','پ','ت','ث','ج','چ','ح','خ','د','ذ','ر','ز','ژ','س','ش','ص','ض','ط','ظ','ع','غ','ف','ق','ک','گ','ل','م','ن','و','ه','ي']
print(sorted(a,key=locale.strxfrm))
对象列表:
a = [{'id':"ا"},{'id':"ب"},{'id':"پ"},{'id':"ت"},{'id':"ث"},{'id':"ج"},{'id':"چ"},{'id':"ح"},{'id':"خ"},{'id':"د"},{'id':"ذ"},{'id':"ر"},{'id':"ز"},{'id':"ژ"},{'id':"س"},{'id':"ش"},{'id':"ص"},{'id':"ض"},{'id':"ط"},{'id':"ظ"},{'id':"ع"},{'id':"غ"},{'id':"ف"},{'id':"ق"},{'id':"ک"},{'id':"گ"},{'id':"ل"},{'id':"م"},{'id':"ن"},{'id':"و"},{'id':"ه"},{'id':"ي"}]
print(sorted(a, key=lambda x: locale.strxfrm(x['id']))
最后,您可以返回地区设置信息:
locale.setlocale(locale.LC_ALL, '')
locale.getlocale(LC_COLLATE)
返回什么? - Amberlocale
模块使用 C 库的 locale API,因此如果出现错误,则必须在 C 库中。使用 localede_DE.UTF-8
和字符串ä
而不是ą
进行等效测试可以正常工作。即使我使用带有ą
的德语区域设置,顺序也是正确的,因此 C 库中的波兰语区域实现可能存在问题。作为解决方法,您可以使用unicodedata.normalize
将字符串转换为规范化形式 D,然后即使是简单的strcmp
排序也应该可以工作。 - Philipppl_PL.UTF-8
和de_DE.UTF-8
,还尝试了在OS X上使用sort(key=locale.strxfrm)
而不是使用strcoll
,但目前我得到的结果与你的不正确。在de_DE.UTF8
中,字符ä
对我来说无法正常工作。 - chryss