正規表現を使用して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つの選択肢が「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ヘッダーに文字セットが指定されています。
はい、必ずUnicode修飾子を使用できますが、結果やパフォーマンスには影響しません。
Preg_replaceは自動的にすべてのasciiパラメータをUnicodeに変換しますか? – user1235446
UTF-8ではASCII文字(コード・ポイント0-127)が同一であるため、変換は必要ありません。 –
今私は理解しない。私は、文字のコードポイントではなく、ascii文字列の場合は各バイト、utf-8の場合はそれぞれ2バイトで比較すると考えました。 – user1235446
7ビットASCII文字セットは、UTF-8で同じようにエンコードされます。 ASCII文字列を使用している場合は、PREG "u"修飾子を使用することができます。
ただし、ISO-8859-1、Windows-1252、HP-Roman8などの「補足された」8ビットASCII文字セットを使用している場合、左端のビットが設定されている文字(値x80-xff)はUTF-8で同じものをエンコードし、PREG "u"修飾子を使用することは適切ではありません。
- 1. CSS BEM、修飾子の文字列.. ..?
- 2. python機械学習可変長文字列修飾子
- 3. パターンを固定文字列として扱うRegex修飾子
- 4. セッション修飾子
- 5. アクセス修飾子
- 6. 修飾子
- 7. プロパティ修飾子
- 8. アクセス修飾子
- 9. パッケージプライベートアクセス修飾子
- 10. private修飾子
- 11. 修飾子のエラー
- 12. Java修飾子の構文とフォーマット
- 13. 文字列、変数、配列修飾子をPHPの変数に連結する方法
- 14. 修飾子に基づいた文字列の連結と収穫ブロック
- 15. 修正文字列、PHP
- 16. OpenGL:レイアウト修飾子?
- 17. Gtk keypress修飾子
- 18. Vue.js - マウスイベント修飾子
- 19. preg_match_all不明修飾子 '/'
- 20. ConcurrentHashMap修飾子の同期
- 21. __device__修飾子の範囲
- 22. マクロ内のコロン修飾子
- 23. テンプレートクラスのconst修飾子コンストラクタ
- 24. "Windows"キーのInputGesture修飾子
- 25. CodeModel修飾子の順番
- 26. デフォルトのアクセス修飾子7
- 27. $ inc修飾子のMongoKittenサポート
- 28. Delphiのアクセス修飾子
- 29. C#のクラスアクセス修飾子
- 30. Unicode文字列(パイソン)
> HTTP経由でフェッチされた文字列には、HTTPヘッダーに文字セットが指定されています。 ' 'ヘッダを送信します。とにかく、$ _POST変数にmb_detect_encodingを使用すると、 'ascii'が返されます。それは推測が間違っていて、文字列がutf-8でエンコードされているということですか? – user1235446
いいえ、ASCIIと言えば、おそらくASCIIです。つまり、すべての文字が128未満のコードポイントを持っています(下位互換性のために、ほとんどすべてのエンコードがこれらのコードポイントを共有します)。つまり、ASCII検出は完全に正しいはずですが、他のエンコーディングは正しくないはずです。しかし、他のエンコーディングもあり、UTF-8でない場合、PHPの標準はISO-8859-1(ASCII文字128-255を定義するスーパーセット)であることに注意してください。エンコーディングが指定されていない場合は、ISO-8859-1もWeb上の標準です。 –
申し訳ありませんが、私はまだ理解していません。上記のヘッダーを送信することは、私のサーバーがutf-8でエンコードされたすべてのユーザーデータを受け取ることを意味しますか? user1235446