我正在将一个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'。
我对此有点困惑,我不明白我错过了什么。
提前致谢
答案 0 :(得分:0)
您应该停止进行任何手动编码或解码。
将MySQL连接配置为使用UTF-8编码的Unicode模式:
charset='utf8',
use_unicode=True
这意味着所有结果都将作为unicode strs返回。你不必解码它。
连接编码与表/数据库编码分开。 MySQL和MySQL驱动程序将透明地解码表编码,编码为UTF-8,然后解码为unicode str。
从您的代码中删除所有unicode()
,encode()
和decode()
语句。