将用户输入的字符串与另一个字符串进行比较的最佳方法是什么?
例如:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
user_input = raw_input("Please, write árido: ").decode("utf8")
if u"árido" == user_input:
print "OK"
else:
print "FALSE"
编辑:
此
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from unicodedata import normalize
import sys
uinput2 = "árbol"
uinput = raw_input("type árbol: ")
print "Encoding %s" % sys.stdout.encoding
print "User Input \t\tProgram Input"
print "-"*50
print "%s \t\t\t%s \t(raw value)" % (uinput, uinput2)
print "%s \t\t\t%s \t(unicode(value))" % (unicode(uinput), unicode(uinput2))
print "%s \t\t\t%s \t(value.decode('utf8'))" % (uinput.decode("utf-8"), uinput2.decode("utf-8"))
print "%s \t\t\t%s \t(normalize('NFC',value))" % (normalize("NFC",uinput.decode("utf-8")), normalize("NFC",uinput2.decode("utf-8")));
print "\n\nUser Input \t\tProgram Input (Repr)"
print "-"*50
print "%s \t%s" % (repr(uinput),repr(uinput2))
print "%s \t%s \t(unicode(value))" % (repr(unicode(uinput)), repr(uinput2))
print "%s \t%s \t(value.decode('utf8'))" % (repr(uinput.decode("utf-8")), repr(uinput2.decode("utf-8")))
print "%s \t%s \t(normalize('NFC',value)))" % (repr(normalize("NFC",uinput.decode("utf-8"))), repr(normalize("NFC",uinput2.decode("utf-8"))));
打印:
type árbol: árbol
Encoding utf-8
User Input Program Input
--------------------------------------------------
árbol árbol (raw value)
árbol árbol (unicode(value))
árbol árbol (value.decode('utf8'))
árbol árbol (normalize('NFC',value))
User Input Program Input (Repr)
--------------------------------------------------
'\xc3\x83\xc2\xa1rbol' u'\xe1rbol'
u'\xc3\xa1rbol' u'\xe1rbol' (unicode(value))
u'\xc3\xa1rbol' u'\xe1rbol' (value.decode('utf8'))
u'\xc3\xa1rbol' u'\xe1rbol' (normalize('NFC',value)))
有什么想法吗?当我使用Java等其他语言时,我没有遇到任何问题。这只发生在python上。我正在使用Eclipse。
提前致谢:)
答案 0 :(得分:1)
您可以查看终端的字符编码吗,
导入sys
sys.stdin.encoding
如果是UTF-8,则解码应该没问题。否则,您必须使用正确的编码解码raw_input。
喜欢,raw_input()。decode(sys.stdin.encoding),如果需要的话,检查它是否与Unicode规范化一致。
答案 1 :(得分:0)
您当前的方法并不错,但您应该使用unicodedata.normalize()
进行比较。上面链接的文档解释了为什么这是一个好主意。例如,尝试评估以下内容:
u'Ç' == u'Ç'
扰流警报,这将给你False
,因为左侧是序列U + 0043(拉丁文大写字母C)U + 0327(组合CEDILLA),右侧是单字符U + 00C7 (带有CEDILLA的拉丁文大写字母C)。
首先将字符串转换为规范化形式,您可以使用unicodedata.normalize()
来正确处理此问题。例如:
# -*- coding: utf-8 -*-
from unicodedata import normalize
from __future__ import unicode_literals
user_input = normalize('NFC', raw_input("Please, write árido: ").decode("utf8"))
if normalize('NFC', u"árido") == user_input:
print "OK"
else:
print "FALSE"