理由:
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