[英]Convert encoding function Python35
我正在將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文件將此字符串'°C'插入到數據庫(latin-1)中的單元測試中,就會出現此問題。
插入之后,單元測試將數據庫中的值(我將此字符視為“°C”)與調用帶有以下參數的convert_encoding
函數的Python字符串(“°C”)進行比較:
source_encoding='latin-1', destination_encoding='utf-8'
我期望的是將數據庫字符串'°C'轉換為'°C',但是數據庫字符串卻變為b'\\ xc3 \\ x82 \\ xc2 \\ xb0C'。
我檢查了有關編碼功能的python文檔,發現它返回一個字節對象。
所以我試圖以這種方式轉換
bytes.decode(b'\xc3\x82\xc2\xb0C', 'utf-8')
但是結果又是“°C”。
我對此有些困惑,我不明白我所缺少的。
提前致謝
您應該停止進行任何手動編碼或解碼。
將您的MySQL連接配置為使用UTF-8編碼的Unicode模式:
charset='utf8',
use_unicode=True
這意味着所有結果都將以unistr形式返回。 您將不必對其進行解碼。
連接編碼與表/數據庫編碼是分開的。 MySQL和MySQL驅動程序將透明解碼表編碼,編碼為UTF-8,然后解碼為unistr。
從代碼中刪除所有unicode()
, encode()
和encode()
decode()
語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.