python错误的字符编码比较

时间:2012-06-11 23:30:16

标签: python encoding

Python中的西里尔字符比较存在问题。这是小测试用例%

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def convert(text):
    result = []
    for i in xrange(len(text)):
        if text[i].lower() == 'й':
            result.append('q')
    print result

if __name__ == '__main__':
    convert('йцукенг')

你肯定会看到,第一个字符应该等于条件中的字符。但条件失败,结果是空的。

此外,如果我尝试打印整个字符串(文本),它运行良好,但如果我尝试只打印一个字符(如文本[2]) - 我得到'?'在输出中。

我确定问题出在编码上,但是如何正确比较单独的字符呢?

2 个答案:

答案 0 :(得分:3)

您看到此行为是因为您循环遍历UTF-8字符串中的字节,而不是字符。以下是差异的一个例子:

>>> 'й'               # note that this is two bytes
'\xd0\xb9'
>>> 'йцукенг'[0]      # but when you loop you are looking at a single byte
'\xd0'
>>> len('йцукенг')    # 7 characters, but 14 bytes
14

这就是为什么有必要使用Unicode来检查字符,就像在mVChr的答案中一样。

这样做最简单的方法是让所有代码保持完全相同,只需在所有字符串文字(uu'йцукенг')中添加u'й'前缀即可。

答案 1 :(得分:1)

假设你使用的是Python 2.X,你应该使用unicode字符串,试试:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def convert(text):
    result = []
    for i in xrange(len(text)):
        if text[i].lower() == unicode('й', 'utf8'):
            result.append('q')
    print result

if __name__ == '__main__':
    convert(unicode('йцукенг', 'utf8'))

或者您只需输入u'йцукенг'u'й'的原始unicode字符串