Python:lower() 方法在字符串中生成错误的字母

问题描述

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”字母。它的原因是什么(编码/解码)?为什么“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'

但在我的其中一个编辑器上显示为:

Image of editor with dot over m

所以看起来这就是 OP 所看到的。以下比较将起作用:

if "çeki\N{COMBINING DOT ABOVE}m" in sentence_:
    print("yes-2")