使用 python 2.7:
>myCity = 'Isparta'
>myCity.lower()
>'isparta'
#-should be-
>'ısparta'
尝试了一些解码,(如 myCity.decode("utf-8").lower()) 但找不到如何做到这一点。
怎么能降低这种字母?(“我”>“我”,“我”>“我”等)
编辑:在土耳其语中,“I”的小写字母是“ı”。'i' 的大写是 'İ'
有些人建议使用tr_TR.utf8
语言环境。至少在 Ubuntu 上,可能与此错误有关,设置此语言环境不会产生所需的结果:
import locale
locale.setlocale(locale.LC_ALL, 'tr_TR.utf8')
myCity = u'Isparta İsparta'
print(myCity.lower())
# isparta isparta
因此,如果此错误影响到您,作为一种解决方法,您可以自己执行此翻译:
lower_map = {
ord(u'I'): u'ı',
ord(u'İ'): u'i',
}
myCity = u'Isparta İsparta'
lowerCity = myCity.translate(lower_map)
print(lowerCity)
# ısparta isparta
印刷
ısparta isparta
您应该使用来自emre 解决方案的unicode 的新派生类
class unicode_tr(unicode):
CHARMAP = {
"to_upper": {
u"ı": u"I",
u"i": u"İ",
},
"to_lower": {
u"I": u"ı",
u"İ": u"i",
}
}
def lower(self):
for key, value in self.CHARMAP.get("to_lower").items():
self = self.replace(key, value)
return self.lower()
def upper(self):
for key, value in self.CHARMAP.get("to_upper").items():
self = self.replace(key, value)
return self.upper()
if __name__ == '__main__':
print unicode_tr("kitap").upper()
print unicode_tr("KİTAP").lower()
给
KİTAP
kitap
这必须解决你的问题。
我通过猴子修补方法对内置 unicode 模块进行了分叉和重新设计了 Emre 的解决方案。这种新方法的优点是无需使用 unicode 的子类,my_unicode_string = unicode_tr(u'bla bla bla')
只需导入此模块即可重新定义 unicode 字符串,与内置的原生 unicode 字符串无缝集成
https://github.com/technic-programming/unicode_tr
# -*- coding: utf8 -*-
# Redesigned by @guneysus
import __builtin__
from forbiddenfruit import curse
lcase_table = tuple(u'abcçdefgğhıijklmnoöprsştuüvyz')
ucase_table = tuple(u'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ')
def upper(data):
data = data.replace('i',u'İ')
data = data.replace(u'ı',u'I')
result = ''
for char in data:
try:
char_index = lcase_table.index(char)
ucase_char = ucase_table[char_index]
except:
ucase_char = char
result += ucase_char
return result
def lower(data):
data = data.replace(u'İ',u'i')
data = data.replace(u'I',u'ı')
result = ''
for char in data:
try:
char_index = ucase_table.index(char)
lcase_char = lcase_table[char_index]
except:
lcase_char = char
result += lcase_char
return result
def capitalize(data):
return data[0].upper() + data[1:].lower()
def title(data):
return " ".join(map(lambda x: x.capitalize(), data.split()))
curse(__builtin__.unicode, 'upper', upper)
curse(__builtin__.unicode, 'lower', lower)
curse(__builtin__.unicode, 'capitalize', capitalize)
curse(__builtin__.unicode, 'title', title)
if __name__ == '__main__':
print u'istanbul'.upper()
print u'İSTANBUL'.lower()
您可以在更改为上/下之前使用 .replace() 函数。在你的情况下:
myCity.replace('I', 'ı').lower()
您需要设置正确的语言环境(我猜是 tr-TR)locale.setLocale()
。否则,将使用默认的上下映射,如果该默认值为 en-US,则小写版本I
为i
.