理由:
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 Ä。これは、特定の文字を検出して変換するために組み合わせた
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