2011-01-27 15 views
4

リクエストURLで、クエリ文字列?dir=Documents%20partag%C3%A9sまたは?dir=Documents%20partag%E9sを取得できます。私は最初のものがUTF-8で、2番目がASCIIだと思います。URLクエリ文字列エンコーディングを検出する

本当の文字列は次のとおりです。Documents partagés

だから、私はと私は何をしたい(UTF-8に)PHPスクリプトを持って、クエリ文字列は、ASCIIまたはUTF-8があるかどうかを検出することであり、もしASCIIで、UTF-8に変換します。

私はmb_関数で試しましたが、クエリ文字列は常にASCIIとして、クエリ文字列のurldecodeバージョンはUTF-8として検出されます。

どうすればこの問題を解決できますか? Wikipediaにも同様の機能があります。-%E9%C3%A9をエンコードします。

+0

たぶん、php.netのこのコメントはあなたを助けることができます:http ://at2.php.net/manual/en/function.mb-check-encoding.php#95289 – thedom

答えて

6

E9は、10進数で233です。有効なASCIIバイト(0-127のみ)ではありませんが、ISO-8859-1(Latin1)ではéです。 mb_convert_encodingを使用する場合は、複数のエンコード(例:UTF-8とISO-8859-1)を指定できます。

これはそれを修正する必要があります。次のスクリプトでは

mb_convert_encoding($str, 'UTF-8', 'UTF-8,ISO-8859-1'); 

$str1 = 'Documents%20partag%E9s'; 
$str2 = 'Documents%20partag%C3%A9s'; 
var_dump(mb_convert_encoding(urldecode($str1), 'UTF-8', 'UTF-8,ISO-8859-1')); 
var_dump(mb_convert_encoding(urldecode($str2), 'UTF-8', 'UTF-8,ISO-8859-1')); 

を私が手:

string(19) "Documents partagés" 
string(19) "Documents partagés" 
+1

'urldecode'は'%E9'を値0xE9の* byte *にデコードしますregこのバイトがどのような文字を表現していないかはわかりません。 – Gumbo

+1

それも間違っています。 1バイトは1バイトです。文字列も単なるバイト列であり、データであり情報ではありません。特定の文字エンコーディングで解釈された場合に限り、これらのバイトは単なるバイトではなく、文字、つまり情報も表します。そして 'urldecode'は'%93'を値0x93のバイトに変えるだけです。それでおしまい。特定の文字エンコーディング(ISO 8859-1のような)で解釈された場合に限り、バイトはその文字セット内の文字を表します(バイトシーケンスが有効である限り)。 – Gumbo

+0

US-ASCII文字セットの文字数は128文字(0x00-0x7Fでエンコードされています)です。他のバイトは無効です。 – Gumbo

関連する問題