簡體   English   中英

轉換編碼功能Python35

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM