Python: lower() 方法在字符串中生成了错误的字母
Python: lower() method generates wrong letter in a string
text = 'ÇEKİM GÜNÜ KALİTESİNİ DÜZENLERLSE'
sentence = text.split(' ')
print(sentence)
if "ÇEKİM" in sentence:
print("yes-1")
print(" ")
sentence_ = text.lower().split(' ')
print(sentence_)
if "çekim" in sentence_:
print("yes-2")
>> output:
['ÇEKİM', 'GÜNÜ', 'KALİTESİNİ', 'DÜZENLERLSE']
yes-1
['çeki̇m', 'günü', 'kali̇tesi̇ni̇', 'düzenlerlse']
我对字符串有疑问。我有一个像文本的句子。当我检查这个句子拆分列表中的特定单词时,我可以找到“ÇEKİM”单词(打印是)。但是,当我通过降低句子进行搜索时,我无法在列表中找到,因为它改变了“i”字母。这是什么原因 (encoding/decoding)?为什么“lower()”方法除了降低之外还更改字符串?顺便说一句,这是一个土耳其语单词。上音:ÇEKİM - 下音:çekim
土耳其语 i 和英语 i 的处理方式不同。大写的土耳其语 i 是 İ,而大写的英语 i 是 I。为了区分 Unicode 有转换为小写和大写的规则。小写土耳其语 i 有一个组合标记。此外,将小写版本转换为大写版本会使字符处于分解形式,因此适当的比较需要将字符串规范化为标准形式。您不能将分解的表单与组合的表单进行比较。请注意以下字符串的差异:
#coding:utf8
import unicodedata as ud
def dump_names(s):
print('string:',s)
for c in s:
print(f'U+{ord(c):04X} {ud.name(c)}')
turkish_i = 'İ'
dump_names(turkish_i)
dump_names(turkish_i.lower())
dump_names(turkish_i.lower().upper())
dump_names(ud.normalize('NFC',turkish_i.lower().upper()))
string: İ
U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
string: i̇
U+0069 LATIN SMALL LETTER I
U+0307 COMBINING DOT ABOVE
string: İ
U+0049 LATIN CAPITAL LETTER I
U+0307 COMBINING DOT ABOVE
string: İ
U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
一些终端也有显示问题。我的系统显示 '',m 上有一个点,而不是 i。例如,在 Chrome 浏览器上,下面会正确显示:
>>> s = 'ÇEKİM'
>>> s.lower()
'çeki̇m'
但在我的一位编辑器上它显示为:
看来 OP 看到的就是这样。以下比较将起作用:
if "çeki\N{COMBINING DOT ABOVE}m" in sentence_:
print("yes-2")
text = 'ÇEKİM GÜNÜ KALİTESİNİ DÜZENLERLSE'
sentence = text.split(' ')
print(sentence)
if "ÇEKİM" in sentence:
print("yes-1")
print(" ")
sentence_ = text.lower().split(' ')
print(sentence_)
if "çekim" in sentence_:
print("yes-2")
>> output:
['ÇEKİM', 'GÜNÜ', 'KALİTESİNİ', 'DÜZENLERLSE']
yes-1
['çeki̇m', 'günü', 'kali̇tesi̇ni̇', 'düzenlerlse']
我对字符串有疑问。我有一个像文本的句子。当我检查这个句子拆分列表中的特定单词时,我可以找到“ÇEKİM”单词(打印是)。但是,当我通过降低句子进行搜索时,我无法在列表中找到,因为它改变了“i”字母。这是什么原因 (encoding/decoding)?为什么“lower()”方法除了降低之外还更改字符串?顺便说一句,这是一个土耳其语单词。上音:ÇEKİM - 下音:çekim
土耳其语 i 和英语 i 的处理方式不同。大写的土耳其语 i 是 İ,而大写的英语 i 是 I。为了区分 Unicode 有转换为小写和大写的规则。小写土耳其语 i 有一个组合标记。此外,将小写版本转换为大写版本会使字符处于分解形式,因此适当的比较需要将字符串规范化为标准形式。您不能将分解的表单与组合的表单进行比较。请注意以下字符串的差异:
#coding:utf8
import unicodedata as ud
def dump_names(s):
print('string:',s)
for c in s:
print(f'U+{ord(c):04X} {ud.name(c)}')
turkish_i = 'İ'
dump_names(turkish_i)
dump_names(turkish_i.lower())
dump_names(turkish_i.lower().upper())
dump_names(ud.normalize('NFC',turkish_i.lower().upper()))
string: İ
U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
string: i̇
U+0069 LATIN SMALL LETTER I
U+0307 COMBINING DOT ABOVE
string: İ
U+0049 LATIN CAPITAL LETTER I
U+0307 COMBINING DOT ABOVE
string: İ
U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
一些终端也有显示问题。我的系统显示 '',m 上有一个点,而不是 i。例如,在 Chrome 浏览器上,下面会正确显示:
>>> s = 'ÇEKİM'
>>> s.lower()
'çeki̇m'
但在我的一位编辑器上它显示为:
看来 OP 看到的就是这样。以下比较将起作用:
if "çeki\N{COMBINING DOT ABOVE}m" in sentence_:
print("yes-2")