我將一個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」一次。
我對此有點困惑,我不明白我在想什麼。
在此先感謝
感謝您的回答,是的,您是對的,但不幸的是我無法修改數據庫配置 – Giordano
不,不。在Python中更改數據庫連接設置 –
@Giordano爲什麼不能在Python中更改數據庫連接設置? –