2012-04-02 28 views
1

正規表現を使用してPHPスクリプトで文字列を処理する必要があります。しかし、文字列が違うとエンコーディングが違うという問題があります。文字列にASCII記号が含まれている場合、mb_detect_encoding関数は 'ASCII'を返します。しかし、文字列にロシアのシンボルが含まれている場合、たとえば、mb_detect_encodingは 'UTF-8'を返します。手動で各文字列のエンコーディングをチェックするのは良い考えではありません。 質問があります - ASCII文字列にpreg_replace(unicode修飾子付き)を使用するのは正しいですか? asciiとutf-8の両方の文字列にそのようなコードpreg_replace ("/[^_a-z]/u","",$string);を書くのは正しいですか?php preg_replace:ASCII文字列のUnicode修飾子

答えて

2

2つの選択肢が「UTF-8」または「ASCII」の場合は問題ありませんが、そうではありません。

PHPがUTF-8を使用しない場合は、ASCIIではないISO-8859-1を使用します(これはASCIIのスーパーセットで、最初の127文字であるため、ASCIIのスーパーセットです)。スウェーデンのものåäöは、ISO-8859-1とUnicodeの両方で、異なるコードポイントで表現することができます!私はこの問題をpreg_ *関数についてはあまり考えていないので、あなたの質問には当てはまらないかもしれません。

mb_detect_encoding(mb_detect_encodingは保証ではない、単なる推測)の魔法なしに、あなたの文字列がどの文字セットであるかを本当に知ろうとしていなければなりません。例、HTTPを介して取得された文字列doe HTTPヘッダーに文字セットが指定されています。

+0

> HTTP経由でフェッチされた文字列には、HTTPヘッダーに文字セットが指定されています。 ' 'ヘッダを送信します。とにかく、$ _POST変数にmb_detect_encodingを使用すると、 'ascii'が返されます。それは推測が間違っていて、文字列がutf-8でエンコードされているということですか? – user1235446

+0

いいえ、ASCIIと言えば、おそらくASCIIです。つまり、すべての文字が128未満のコードポイントを持っています(下位互換性のために、ほとんどすべてのエンコードがこれらのコードポイントを共有します)。つまり、ASCII検出は完全に正しいはずですが、他のエンコーディングは正しくないはずです。しかし、他のエンコーディングもあり、UTF-8でない場合、PHPの標準はISO-8859-1(ASCII文字128-255を定義するスーパーセット)であることに注意してください。エンコーディングが指定されていない場合は、ISO-8859-1もWeb上の標準です。 –

+0

申し訳ありませんが、私はまだ理解していません。上記のヘッダーを送信することは、私のサーバーがutf-8でエンコードされたすべてのユーザーデータを受け取ることを意味しますか? user1235446

0

はい、必ずUnicode修飾子を使用できますが、結果やパフォーマンスには影響しません。

+0

Preg_replaceは自動的にすべてのasciiパラメータをUnicodeに変換しますか? – user1235446

+0

UTF-8ではASCII文字(コード・ポイント0-127)が同一であるため、変換は必要ありません。 –

+0

今私は理解しない。私は、文字のコードポイントではなく、ascii文字列の場合は各バイト、utf-8の場合はそれぞれ2バイトで比較すると考えました。 – user1235446

0

7ビットASCII文字セットは、UTF-8で同じようにエンコードされます。 ASCII文字列を使用している場合は、PREG "u"修飾子を使用することができます。

ただし、ISO-8859-1、Windows-1252、HP-Roman8などの「補足された」8ビットASCII文字セットを使用している場合、左端のビットが設定されている文字(値x80-xff)はUTF-8で同じものをエンコードし、PREG "u"修飾子を使用することは適切ではありません。