问题描述
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'
但在我的其中一个编辑器上显示为:
所以看起来这就是 OP 所看到的。以下比较将起作用:
if "çeki\N{COMBINING DOT ABOVE}m" in sentence_:
print("yes-2")