转换编码函数Python35

时间:2017-06-19 10:16:17

标签: python django python-2.7 python-3.x encoding

我正在将一个Django应用程序从Python27移植到Python35。
我使用了2to3来自动化代码转换,但是我遇到了一个用指定编码转换字符串的函数。
功能如下:

def convert_encoding(text, source_encoding=None, destination_encoding='utf-8'):    
    if not isinstance(text, unicode):
        try:
            text = unicode(text, encoding=source_encoding, errors='ignore')
        except UnicodeDecodeError as exc:
            # write log
            pass

    try:
        text = text.encode(encoding=destination_encoding, errors='ignore')
    except Exception as exc:
        # write log
        pass

    return text

更详细地说,当我需要将db值与某些字符串进行比较时,会使用此函数。
db表以Latin-1编码,但我应该将字符串转换为UTF-8。

我知道在Python3中所有字符串都是Unicode,所以根据我的理解,我应该从我的函数中删除以下代码:

if not isinstance(text, unicode):
    try:
        text = unicode(text, encoding=source_encoding, errors='ignore')
    except UnicodeDecodeError as exc:
        # write log
        pass

例如,在通过sql文件在数据库(latin-1)中插入此字符串'°C'的单元测试中引发了该问题。

在插入之后,单元测试将数据库中的值(我将此字符显示为“°C”)与使用以下参数调用convert_encoding函数的Python字符串('°C')进行比较:

source_encoding='latin-1', destination_encoding='utf-8'

我期望db字符串'°C'转换为'°C',而db字符串更改为b'\ xc3 \ x82 \ xc2 \ xb0C'。
我检查了有关编码函数的python文档,我发现它返回一个bytes对象。
所以我试着用这种方式转换它

bytes.decode(b'\xc3\x82\xc2\xb0C', 'utf-8')

但结果又是'°C'。

我对此有点困惑,我不明白我错过了什么。

提前致谢

1 个答案:

答案 0 :(得分:0)

您应该停止进行任何手动编码或解码。

将MySQL连接配置为使用UTF-8编码的Unicode模式:

charset='utf8',
use_unicode=True

这意味着所有结果都将作为unicode strs返回。你不必解码它。

连接编码与表/数据库编码分开。 MySQL和MySQL驱动程序将透明地解码表编码,编码为UTF-8,然后解码为unicode str。

从您的代码中删除所有unicode()encode()decode()语句。