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

Python 3.x Python:lower()方法在字符串中生成错误的字母,python-3.x,string,decode,encode,Python 3.x,String,Decode,Encode,我对字符串有问题。我有一个像课文一样的句子。当我在这个句子分割列表中检查一个特定的单词时,我可以找到“İEKİM”这个单词(打印“是”)。然而,当我通过降低句子进行搜索时,我无法在列表中找到,因为它更改了“I”字母。原因是什么(编码/解码)?为什么“lower()”方法除了降低字符串之外还改变字符串?顺便说一句,这是一个土耳其语单词。上:İEKİM-下:çekim土耳其语i和英语i受到不同的对待。大写的土耳其语i是İ,而大写的英语i是i。为了区分Unicode,有转换为小写和大写的规则。小写土耳

我对字符串有问题。我有一个像课文一样的句子。当我在这个句子分割列表中检查一个特定的单词时,我可以找到“İEKİM”这个单词(打印“是”)。然而,当我通过降低句子进行搜索时,我无法在列表中找到,因为它更改了“I”字母。原因是什么(编码/解码)?为什么“lower()”方法除了降低字符串之外还改变字符串?顺便说一句,这是一个土耳其语单词。上:İEKİM-下:çekim

土耳其语i和英语i受到不同的对待。大写的土耳其语i是İ,而大写的英语i是i。为了区分Unicode,有转换为小写和大写的规则。小写土耳其语i有一个组合标记。此外,将小写版本转换为大写将使字符保持分解形式,因此适当的比较需要将字符串规范化为标准形式。不能将分解表单与组合表单进行比较。请注意以下字符串中的差异:

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']
一些终端也有显示问题。我的系统在m上显示带点的“”,而不是i。例如,在Chrome浏览器上,以下内容正确显示:

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
但在我的一个编辑器上,它显示为:

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

>>> s = 'ÇEKİM'
>>> s.lower()
'çeki̇m'

您在文本字符串
“çekim”
中使用了ASCII小写字母
i
,但
“İ”。lower()
不仅仅给出ASCII小写字母
i
。它后面跟“i”。相关:是的。我测试过了,它是正确的。一种解决方案是将所有特殊字符(如“İ”)转换为英语格式“I”吗?或者你还有别的选择吗?@Mehmet我不是土耳其语专家,但拼写错误似乎不是最好的解决办法。土耳其语也有一个无点的上/下(I/305)符号,它也有类似的问题。@Mehmet另见和。
>>> s = 'ÇEKİM'
>>> s.lower()
'çeki̇m'
if "çeki\N{COMBINING DOT ABOVE}m" in sentence_:
    print("yes-2")