2016-04-19 14 views
1

PHPで文字エンコーディングを理解するのに苦労しています。私はそのUnicodeコードポイントで表され、実際に€文字、文字列を、持っているPHPで文字エンコーディングを理解する

$string = "\xe2\x82\xac"; 

var_dump(mb_internal_encoding()); 
var_dump($string); 
var_dump(unpack('C*', $string)); 
$utf8string = mb_convert_encoding($string, "UTF-8"); 
var_dump($utf8string); 
var_dump(unpack('C*', $utf8string)); 

mb_internal_encoding("UTF-8"); 

var_dump($string); 
var_dump($utf8string); 

は、次のスクリプトを(あなたがhereそれを実行することができます)考えてみましょう。 PHP 5.5までは、使用される内部エンコーディングはISO-8859-1です。したがって、このエンコーディングを使用して文字列をエンコードすると思います。 unpackで私の文字列のバイト表現を見ることができ、それは文字列を定義するために使用する16進コードに対応しています。

次に、文字列のエンコーディングを、に変換します。mb_convert_encodingを使用します。この時点で、文字列は画面上で異なって表示され、そのバイト表現は変更されます(これは予想されます)。

PHP内部エンコーディングを変更すると、utf8stringが画面に正しく表示されると思われますが、これは起こりません。

私には何が欠けていますか?

+1

ブラウザでこれを実行していますか?それは文字エンコーディングについて独自の選択を行い、問題のキャラクターをエスケープするエンティティの方がよいでしょう。 – Chris

+0

は、ブラウザでも)(PHPのすべての文字列はバイナリ文字列として扱われ、 'mb_internal_encodingれUTF8 – RiggsFolly

+0

を期待している'文字通り他に何も影響しないことを確認するために ''に '' <メタ文字セットが=「UTF8」>を追加します。他の 'mb_ *'関数がどのように機能するかよりも重要です。同じ文書内でISO-8859とUTF8の両方を出力することはできず、どのプログラムが出力を生成しているかにかかわらず何事も起こらないことを期待します。 – Sammitch

答えて

2

あなたが表示するスクリプトはASCII以外の文字を使用しないので、内部的なエンコーディングは何の違いもありません。 mb_internal_encodingは出力時にデータを変換します。 This questionはどのように動作するかについて詳しく説明します。それを使用しないほうがよいとあなたに伝えます。

コード内の3バイト文字列$stringは、ユーロ記号のUTF-8表現であり、「ユニコードコードポイント」(すべての共通Unicode文字のように、2バイト幅:0x20ac)ではありません。

これは表示される動作をクリアしますか?

1

ユーロ記号utf-8の文字列で開始しました。 echo($string)を実行すると、すべてのバージョンのPHPが$stringに入れた3バイトを生成します。それらがブラウザーによってどのように解釈されるかは、Content-Typeヘッダーに指定された文字セットによって決まります。 text/html; charset=utf-8の場合、レンダリングされたページにユーロ記号が表示されます。

あなたは間違った動きをします。 mb_convert_encoding()には、2つの引数のみを指定して呼び出します。これにより、PHPは、第3引数($from_encoding)にmb_string拡張子で使用される内部エンコーディングの現在の値を使用できます。どうして?

PHP 5.6以降では、mb_internal_encoding()によって返されるデフォルト値はutf-8であり、mb_convert_encoding()への呼び出しはノーオペレーションです。

しかし、以前のバージョンのPHPの場合、mb_internal_encoding()によって返されるデフォルト値はiso-8859-1であり、文字列のエンコーディングと一致しません。したがって、mb_convert_encoding()は、$stringのバイトを3つの個々の文字として解釈し、utf-8の規則を使用してそれらを符号化する。結果は明らかに間違っています。

Btwの場合、$string'€'に初期化すると、すべてのPHPバージョン(PHP 4、iircでも)で同じ出力が得られます。

関連する問題