2

悪いデータを含む 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\x9cu'\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 つは間違っているだけであり、私が試したものはどれも正しい結果を返しません。

4

1 に答える 1