悪いデータを含む MySQL データベースがあります。
この Unicode 文字列から始めます。
u'TECNOLOGÍA Y EDUCACIÓN'
データベースを UTF-8 にエンコードすると、次のようになります。
「TECNOLOG\xc3\x8dA Y EDUCACI\xc3\x93N」
latin1
接続文字セットとデータベース文字セットを使用してこれらのバイトをデータベースに送信するとutf8
(はい、これが間違っていることはわかっていますが、これはすでに何度も何度も発生しており、現在の目標は破損の正確なプロセスを把握することです。逆にすることができます)、データは次のように変換されます (を使用してチェックBINARY()
):
「TECNOLOG\xc3\x83\xc2\x8dA Y EDUCACI\xc3\x83\xe2\x80\x9cN」
ダブルエンコーディングはさておき、ここで期待する結果は次のとおりです。
「TECNOLOG\xc3\x83\xc2\x8dA Y EDUCACI\xc3\x83\xc2\x93N」
マルチバイト UTF-8 文字を latin1 として解釈し、各バイトを個別の文字としてエンコードしているため、これのほとんどは理にかなっていますが、\x93
->の変換は\xe2\x80\x9c
意味がありません。latin1は UTF-8に\x93
変換されませんが、CP-1252 文字セットのコードポイントであるを生成して Unicode に変換できます。\xe2\x80\x9c
\xe2\x80\x9c
u'\u201c'
\x93
mysql は、変換を処理するときに latin1 と CP-1252 を組み合わせていますか? Python で変換プロセスを完全に複製するにはどうすればよいですか? システム上のすべてのエンコーディングを繰り返しましたが、文字列全体に対して機能するものはありません。Python では、どのように に'TECNOLOG\xc3\x83\xc2\x8dA Y EDUCACI\xc3\x83\xe2\x80\x9cN'
戻ることができ'TECNOLOG\xc3\x8dA Y EDUCACI\xc3\x93N'
ますか? UTF-8 としてデコードすると、最初の 3/4 は正しく処理されますが、最後の 1 つは間違っているだけであり、私が試したものはどれも正しい結果を返しません。