2017-06-19 36 views
0

我將一個Django應用程序從Python27移植到Python35。
我用2to3爲了自動化代碼翻譯,但我遇到了一個函數,在指定的編碼轉換字符串的麻煩。
的功能如下:轉換編碼函數Python35

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 

更具體地,當我需要分貝值與一些字符串使用此函數。
數據庫表編碼在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文件插入數據庫(拉丁-1)這個字符串'°C'。

插入之後,單元測試比較從數據庫中的值(I看到該字符爲「A°C」)爲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') 

但結果卻是「A°C」一次。

我對此有點困惑,我不明白我在想什麼。

在此先感謝

回答

0

您應該停止進行任何手動編碼或解碼。

配置MySQL連接使用Unicode模式使用UTF-8編碼:

charset='utf8', 
use_unicode=True 

這意味着,所有的結果將作爲Unicode的可疑交易報告被退回。你不需要解碼它。

連接編碼與表/數據庫編碼是分開的。 MySQL和MySQL驅動程序將透明地解碼錶編碼,編碼爲UTF-8,然後解碼爲unicode str。

刪除代碼中的所有unicode()encode()decode()聲明。

+0

感謝您的回答,是的,您是對的,但不幸的是我無法修改數據庫配置 – Giordano

+0

不,不。在Python中更改數據庫連接設置 –

+0

@Giordano爲什麼不能在Python中更改數據庫連接設置? –