1

latin-1 を使用するデータベースと utf-8 の PHP アプリケーションがあります。

データベースには次のような文字列があります。

ソシエテのはずの「ソシエテ」

10億ユーロ」は 20 億ユーロになるはずです。

PHP のord()を使用して障害のある文字を画面に出力すると、db の返されたデータから 195 と 226 が出力されます。

なぜこれが起こっているのか(なぜこのように保存し、なぜ文字がそのまま読み取られるのか)、そして私がそれを元に戻すことができるかどうかを誰かが説明できますか.

4

2 に答える 2

6

理由:

1) éはユニコード233です(ブラウザが読み取るとき)。
élatin1charsバイトに変換されたutf8バイトはÃ ©です。これが、データベースでこのように表示される理由です。
à ©はコードポイント195として認識されÃます。したがって、なぜそれが表示されるのでしょうか。

2) €はUnicode8364です。€utf8バイトはlatin1chars
バイトに変換されますâ <82> ¬。繰り返しますが、これがデータベースにこのように表示される理由です。
â <82> ¬はコードポイント226として認識されâます。これも、これが表示される理由です。

これが、これらの値を表示するord()理由であり、文字がlatin-1データベースにそのように格納されている理由です。

逆行:

これを逆にするには、Latin-1文字バイトからUTF8バイトが必要です。

試してみると:
âは226です。latin-1をutf8に変換すると、が生成されâます。
Ãは195です。latin-1をutf8に変換すると、が生成されÃます。

問題:

問題は、Latin-1の文字数がutf-8よりも少ないことです(長い道のりです)。
Latin1シングルバイトストリームとUTF8マルチバイトcharストリーム。したがって、utf8で1文字を使用すると、latin1で最大4文字を生成できます。
したがって、UTF-8からLatin-1への変換では、誤った文字が生成されます。
Latin1をutf8に戻すことはできません。

解決:

データベースの文字セットを変更できない場合は、データベース内の特殊文字を書き込む前に、その文字エンティティでエンコードすることをお勧めします(したがって、dbはlatin1のままで、appはutf8のままで、どちらもhtmlエンティティを理解できます)。例:umlaut as &Auml;。これは、特定の文字を検出して変換するために組み合わせた
PHPを使用して行うことができます。html_entity_decode()mb_detect_encoding()

参照:

utf8 charバイトからlatin1バイトについては、 ltf.ed.ac.ukを参照してください:http ://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input =%C3%96&mode = char

于 2013-01-28T14:06:01.950 に答える
0
于 2013-01-28T14:12:05.153 に答える