Python y capitalización turca

No he encontrado una buena descripción sobre cómo manejar este problema en Windows, así que lo estoy haciendo aquí.

Hay dos letras en turco I ( I ) e I ( I ) que son manejadas incorrectamente por Python.

 >>> [char for char in 'Mayıs'] ['M', 'a', 'y', 'i', 's'] >>> 'ı'.upper().lower() 'i' 

Cómo debe ser, dado que la configuración regional es correcta:

 >>> [char for char in 'Mayıs'] ['M', 'a', 'y', 'ı', 's'] >>> 'ı'.upper().lower() 'ı' 

y

 >>> 'i'.upper() 'İ' >>> 'ı'.upper() 'I' 

Intenté locale.setlocale(locale.LC_ALL,'Turkish_Turkey.1254') o incluso 'ı'.encode('cp857') pero no ayudó.

¿Cómo hago Python manejar estas dos letras correctamente?

Debes usar PyICU

 >>> from icu import UnicodeString, Locale >>> tr = Locale("TR") >>> s = UnicodeString("i") >>> print(unicode(s.toUpper(tr))) İ >>> s = UnicodeString("I") >>> print(unicode(s.toLower(tr))) ı >>> 

Puede definir su propia función codificada para el problema de caracteres turcos.

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

superior regular

 >>>print("ulvido".upper()) ULVIDO 

nuestra parte superior personalizada

 >>>print(tr_upper("ulvido")) ULVİDO 

Si necesita mucho esta conversión, puede crear un archivo .py. por ejemplo: guárdelo como trtextstyle.py e impórtelo en sus proyectos.

Si trtextstyle.py es el mismo directorio con su archivo:

 from .trtextstyle import tr_upper, tr_lower 

espero que esto ayude.