比较python中的UTF8字符串

比较python中的UTF8字符串,python,encoding,utf-8,Python,Encoding,Utf 8,我想检查一下,如果函数f1(s)的参数s在MyList中接收到一些字符串(在UTF8中),那么调用函数f2;但是我不能正确地比较字符串 def f1( s ): MyList = [ u"نامشخص".encode("utf-8") , u"Unknow".encode("utf-8")] for t in MyList: if( t == s.encode('utf-8') ): f2() return None

我想检查一下,如果函数f1(s)的参数s在MyList中接收到一些字符串(在UTF8中),那么调用函数f2;但是我不能正确地比较字符串

def f1( s ):
    MyList = [ u"نامشخص".encode("utf-8") , u"Unknow".encode("utf-8")]
    for t in MyList:
        if( t == s.encode('utf-8') ):
            f2()
            return None
            break
        else:
            print "Checked strings: ",  t , " =?=" , s.encode("utf-8")
            print "Checked strings length: ", len(t),  " =?=" , len(s)
    return s
检查:

MyList2 = [ u"نامشخص" , "test2".encode("utf-8"), u"نامشخص".encode("utf-8") ]

for a in MyList2:
    print "Test String = ", a
    f1(a)
    print "\n\n"
输出:

 Test String =  نامشخص
 Here[=]



Test String =  test2
Checked strings:  نامشخص  =?= test2
Checked strings length:  12  =?= 5

Checked strings:  Unknow  =?= test2
Checked strings length:  6  =?= 5



Test String =  نامشخص
Traceback (most recent call last):
  File "test.py", line 31, in <module>
    f1(a)
  File "test.py", line 18, in f1
    if( t == s.encode('utf-8') ):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128)
测试字符串 此处[=] 测试字符串=test2 选中字符串:ناشخ=?=test2 选中字符串长度:12=?=5 选中字符串:Unknow=?=test2 选中字符串长度:6=?=5 测试串=测试串 回溯(最近一次呼叫最后一次): 文件“test.py”,第31行,在 f1(a) f1中第18行的文件“test.py” 如果(t==s.encode('utf-8')): UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xd9:序号不在范围内(128) 事实上,我从sqlite db接收字符串s,但我不知道s的编码。 有趣的是,对于DBF1中的一些字符串,没有错误!
f1似乎只适用于某些指定的编码。是否有任何解决方案适用于字符串s的所有编码?

我认为python不喜欢double
.encode(“utf-8”)
。此脚本产生了相同的问题:

a = u"نامشخص"
b = a.encode("utf-8")  # This work !
c = b.encode("utf-8")  # Not that.
您可以使用try/except来处理此问题(请参阅:)

这可以是一个解决方案:

def get_unicode(s):
    try:
        return s.encode("utf-8")
    except:
        return s
编辑:可能是更好的测试:

def get_unicode(s):
    if isinstance(s, unicode):
        return s.encode("utf-8")
    return s

你能发布你的输出和测试吗?这对我来说没有任何问题。你的回答给了我一个想法。事实上,我从sqlite db接收字符串s,但我不知道s的编码。对于某些字符串,db f1中的s仍然会出错,没有任何错误!我将尝试扩展您的功能以解决此问题。非常感谢。