2017-06-19 4 views
0

私は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」です。

私はこれについて少し混乱しています、私は何が欠けているのか分かりません。

ありがとうございます。

答えて

0

手動のエンコーディングまたはデコードをやめてください。

はUTF-8エンコーディングをUnicodeモードを使用するようにMySQLの接続を設定します。

charset='utf8', 
use_unicode=True 

これは、すべての結果がUnicode STRSとして返されることを意味します。デコードする必要はありません。

接続エンコーディングは、テーブル/データベースエンコーディングとは別です。 MySQLとMySQLドライバは、テーブルエンコーディングを透過的にデコードし、UTF-8にエンコードし、strをユニコードにデコードします。

コードからunicode()encode()、およびdecode()ステートメントをすべて削除します。

+0

回答ありがとうございますが、残念ながらデータベース構成を変更できません。 – Giordano

+0

いいえ、いいえ。 Pythonでデータベース接続の設定を変更する –

+0

@Giordano Pythonでデータベース接続の設定を変更できないのはなぜですか? –