私はPython27からPython35にDjangoアプリケーションを移植しています。
コード変換を自動化するために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
もっと私はいくつかの文字列にデシベル値を比較する必要があるときに、この関数が使用されています。
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)にこの文字列 '℃'を挿入することをテストします。
:
挿入した後、ユニットテストは、次のパラメータを使用して関数を呼び出すPythonの文字列(「°C」)に(私は「A°C」としてこの文字を参照)、データベースから値を比較します
source_encoding='latin-1', destination_encoding='utf-8'
db文字列 '°C'は '℃'に変換されますが、db文字列はb '\ xc3 \ x82 \ xc2 \ xb0C'に変更されます。
エンコード関数に関するpythonのドキュメントを調べましたが、バイトオブジェクトを返すことがわかりました。
は、だから私はこのよう
bytes.decode(b'\xc3\x82\xc2\xb0C', 'utf-8')
にそれを変換しようとしましたが、結果は再び「A°C」です。
私はこれについて少し混乱しています、私は何が欠けているのか分かりません。
ありがとうございます。
回答ありがとうございますが、残念ながらデータベース構成を変更できません。 – Giordano
いいえ、いいえ。 Pythonでデータベース接続の設定を変更する –
@Giordano Pythonでデータベース接続の設定を変更できないのはなぜですか? –