Python `str.upper()`方法不考虑'LC_CTYPE'设置,但'pyicu'考虑

Python `str.upper()`方法不考虑'LC_CTYPE'设置,但'pyicu'考虑,python,string,unicode,locale,Python,String,Unicode,Locale,当使用Python自己的locale模块和str.upper()方法时,“伊斯坦布尔”。upper()返回不正确的结果 >>> import locale >>> locale.setlocale(locale.LC_ALL, 'tr_TR.UTF-8') >>> 'tr_TR.UTF-8' >>> s1 = 'istanbul' >>> s1.upper() 'ISTANBUL' 如果我安装并使用pyi

当使用Python自己的
locale
模块和
str.upper()
方法时,
“伊斯坦布尔”。upper()
返回不正确的结果

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'tr_TR.UTF-8')
>>> 'tr_TR.UTF-8'
>>> s1 = 'istanbul'
>>> s1.upper()
'ISTANBUL'
如果我安装并使用
pyicu
,它将按预期工作

>>> from icu import Locale, UnicodeString
>>> tr = Locale('tr_TR.UTF-8')
>>> s2 = UnicodeString('istanbul')
>>> str(s2.toUpper(tr))
'İSTANBUL'

如何确保Python的内置模块和方法在给定的语言环境下正常工作?

不幸的是,如果不使用包,就无法做到这一点。正如您所说,您可以使用
pyicu
,但如果您不想使用它,则可以对其进行硬编码:

import re

def tr_upper(word):
    word = re.sub(r"i", "İ", word)
    word = re.sub(r"ı", "I", word)
    word = re.sub(r"ç", "Ç", word)
    word = re.sub(r"ş", "Ş", word)
    word = re.sub(r"ü", "Ü", word)
    word = re.sub(r"ğ", "Ğ", word)
    word = word.upper() # for the rest use default upper
    return word

print( tr_upper("istanbul") ) #İSTANBUL

在官方python文档中,它说:
locale.LC_CTYPE¨字符类型函数的locale类别。根据此类别的设置,处理大小写的模块字符串的函数会改变它们的行为。
但是您的回答意味着python根本不使用
LC\u CTYPE
。我简直不敢相信。情况不是你。python似乎无法正确处理
i,İ,i,ı
,这是软件世界中一个非常常见的问题。@kureta:这不是python的问题,因为这些东西都被转移到了操作系统上。ICU使用自己的定位数据库。所以,您能检查一下操作系统是否安装了您的语言环境(
locale-a
),拼写是否正确,以及它是否可以进行这样的转换吗?更正(我之前的评论)。Python使用通用的Unicode算法。因此,根据pythondoc,“没有办法根据区域设置执行大小写转换和字符分类”,这很遗憾,因为他们知道这个问题。