4

最近、Latin1を使用してエンコードされ、ブラウザーの疑問符記号で表示されたときにレンダリングされていたMySQLデータベースに遭遇しました。これを修正するために、すべてのテーブルでDBのエンコーディングをutf8に、Collat​​ionをutf8_general_ciに変更しましたが、既に保存されているデータはまだ疑問符の記号で表示され、mysqlからブラウザーへのデータの保存とポーリングはすべて行われました。 phpによって行われた私はutf8がphpでも使用されていることを確認し、多くの人がオンラインで提案したようにセット名utf8を実行しましたが、問題は、文字列にÃÂ'などの奇妙な文字がないことを知っていたということです。

データの例

保存:

EMMANUEL PE \ xc3 \ u0192 \ xc2 \ u2018A GOMEZ PORTUGAL

レンダリング:

EMMANUELPEÃÂ'AGOMEZPORTUGAL

ちゃんとした:

EMMANUELPEÑAGOMEZPORTUGAL


保存:

ルイス・ヘルン\xe1ndez-ヒガレダ

レンダリング:

ルイス・エルナンデス・ヒガレダ

ちゃんとした:

ルイス・エルナンデス・ヒガレダ


保存:

Teresa de Jes \ xc3 \ u0192 \ xc2 \ xbas Galicia G \ xc3 \ u0192 \ xc2 \ xb3mez

レンダリング:

TeresadeJesúsGaliciaGómez

ちゃんとした:

TeresadeJesúsGaliciaGómez


保存:

DR。JOS \ xc3 \ u0192 \ xc2 \ u2030 ABEN \ xc3 \ u0192 \ xc2 \ x81MAR RIC \ xc3 \ u0192 \ xc2 \ x81RDEZ GARC \ xc3 \ u0192 \ xc2 \ x8dA

ちゃんとした:

DR。JOSÉABENÃÂMARRICÃÂRDEZGARCÃÂA

現在、Pythonを使用してDBからデータを取得していますが、Unicode utf8に正規化しようとしていますが、本当に迷っています。ここに到達している限り、現在奇妙なものとして表示されているものを変換する必要があります。上記のように文字を読み取り可能なテキストに変換します。

ここで何が欠けていますか?データは修復不可能ですか?

関数 https://gist.github.com/2649463

注: すべての例の中で、適切にレンダリングされているものが1つあります(これを修正する方法についてアドバイスがあれば、そこに残されているので考慮されます)

4

2 に答える 2

4

これを試して:

print str.encode('cp1252').decode('utf-8').encode('cp1252').decode('utf-8')

使用例ipython

In [49]: a=u'Teresa de Jes\xc3\u0192\xc2\xbas Galicia G\xc3\u0192\xc2\xb3mez'

In [50]: a=u'Teresa de Jes\xc3\u0192\xc2\xbas Galicia G\xc3\u0192\xc2\xb3mez'

In [51]: print a
Teresa de Jesús Galicia Gómez

In [52]: print a.encode('cp1252').decode('utf-8').encode('cp1252').decode('utf-8')
Teresa de Jesús Galicia Gómez

これは「誤ってエンコードされた」 utf-8です。

于 2012-05-09T23:10:24.020 に答える
3

latin1その文字エンコードで保存された列に表現できない文字を挿入しようとすると、それらの文字は元?に戻せなくなります-情報が失われました:列が保存されたので、データを再挿入/更新するしかありませんutf8

ただし、質問の一部のデータはあまり意味がありません。例えば:

保存:

EMMANUEL PE \ xc3 \ u0192 \ xc2 \ u2018A GOMEZ PORTUGAL

現在保存されているバイトまたは文字を表示しようとしていますか?いずれにせよ、\uまたは\xエスケープコードの1つは無意味です。

latin1元のデータは;としてエンコードされたと言います。その文字セットでは、Ñ文字はとしてエンコードされ0xd1ます。次に、データをに変換したとするとutf8、その文字のエンコーディングが2バイトシーケンスに変更されます0xc391(これは、上記のように格納されていることを示していますが、2番目のバイトがどのように変換された\xc3かは明確ではありません。スニペットの0x91シーケンス\u0192\xc2\u2018*)。

データは実際には、おそらく現在保存されているデータと、そのようなストレージを表示するために使用している手段との間で、さらに変換されていると思われます。最初に、データベース内に何が格納されているかを正確に確認することをお勧めします。

SELECT HEX(my_column) FROM my_table WHERE ...

それが決定されると、保存されたデータを作成するためにどのような変換(存在する場合)を使用する必要があるか、utf8および保存および取得操作中にどのような望ましくない変換(存在する場合)が行われるかをよりよく理解できるようになります。


* Thanasis Petsasの回答を読んだところ、正しくエンコードされたutf8文字列をとしてデコードlatin1し、結果の文字を使用してエンコードし、utf8それらのバイトをlatin1再度デコードしたように見えることがわかりました。これは確かにあなたが示した文字シーケンスを生成しますが、それでも実際に何が保存され、何が検索中の変換によるものかを理解する必要があります。

于 2012-05-10T00:21:35.877 に答える