著者: bluedoor
元の投稿アドレス: http://www.anbbs.com/anbbs/index.php?f_id=3&page=1
過去 2 日間、キーワード強調プログラムに取り組んできました。書かれたプログラムはローカルです。テストもうまくいきましたが、ページに行くと文字化けの山があり、ハイライトどころか文字が読めません!
エラーを探して調べてみたところ、英語は問題ありませんでしたが、中国語の文字に遭遇すると問題が発生しやすく、中国語の文字に遭遇すると必ず問題が発生する場合がありました。
まとめると:
preg_match_all($pat,...) や preg_replace($pat,...)... などのパターンマッチングを使用する場合
問題が発生しやすい状況は次のとおりです:
preg_match_all( "/(漢字)+ /ism","私は漢字です。あなたが私に何をするか見てみましょう! ",$m_a); このパターンは、「漢字」と一致するのが非常に簡単です。この場合、漢字を含むパターンは正常に一致しますが、結果が不確かなので、あまり早く満足しないでください。
問題が発生する状況は以下の通りです:
preg_match_all("/[漢字]+/ism","私は漢字です、あなたが私に何をするか見てみましょう!",$m_a); 「汉」、「字」、または「漢字」の出現に一致します。これにより、マッチング結果が文字化けし、無限ループが発生する可能性があります。なぜこのようなことが起こるのでしょうか?これは、PHP が内部で UNICODE を使用しておらず、マルチバイト テキストをサポートしていないため、パターン マッチングでは「漢字」が 4 バイトの ASCII として扱われるためです。エラーが発生しないのはおかしいでしょう。
その後、パターンマッチングを書き直そうとしたところ、問題を解決できそうな(なぜらしいと言うのか?後で見てください)メソッドを見つけました:
preg_match_all("/(汉|字)+/ism"," I am a Chinese Character, see What are you doing to me! ",$m_a);
このように書くと、"汉"、"字"、または "汉字" に一致し、結果は $m_a
配列
(
[0 ] => 配列
(
[0 ] => 漢字
[1] => 配列
(
[0] => 漢字
)
)
完全に一致した文字列はどうでしょうか登場!しかし、喜ぶのはまだ早く、実際に使用すると問題が発生することがよくあります。もう一度問題を探したところ、ついに問題の根本が見つかりました。 PHP はマルチバイトテキストをサポートしていないため、パターンマッチングと文字操作は内部コード変換後に実行されます (これが正しいかどうかはわかりません)。例を挙げてみましょう:
eregi_replace("性","No " , " Responsible"); この操作は、文字列 "Responsible" 内の "gender" という単語を "no" に置き換えることです。最終的な結果はどうなりますか? 「責任感」に「性別」はないので、置換操作を実行せずに「責任感」を返すはずが、結果は「責任感」だった!
予想外でした!なぜ? ASCII コードを見てみるとわかります。ASCII コードは 211,208 (責任)、200,206 (任意)、184,208 (意味) という漢字の「責任感」をコード化しています。そして「性別」 エンコードは 208,212 (性別) で、これはたまたまコードの 2 バイト目と 1 バイト目の組み合わせと一致しています。つまり、PHP は、一致する同じパターンを見つけて、中国語の文字を半分に分割し、置換された文字列と結合することを知っていたため、何か問題が発生しました。
当時は、最も一般的に使用される str_replace() は問題ないと思っていましたが、実際には、同じ操作を実行すると str_replace() もエラーを起こします。以前に漢字置換を行っていて本当に良かったと今では思います。おそらく、このとき行われた漢字置換は比較的長い漢字列であったため、上記のような事態は起こりにくいと考えられます。たとえ何も問題がなかったとしても、安全ではないことを知ってください。
問題はある、そして私たちは働き続けなければならない、乗り越えなければならない唯一の困難は今の私たちです。
幸いなことに、私は PHP 拡張モジュールのセットである Multibyte String Functions を思い出しました。これは、次のようなマルチバイト テキスト操作をサポートする多くの関数を追加します。 ereg_replace() は mb_ereg_replace() に対応します。特定の機能の説明については、関連記事を参照してください。
要約: 漢字を安全に操作するには、マルチバイト文字列関数を使用するのが最善です。
http://www.bkjia.com/PHPjc/532003.html
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/532003.html技術記事著者: bluedoor 元の投稿アドレス: http://www.anbbs.com/anbbs/index.php?f_id=3quot;/(漢字)+/ism、私は漢字です、あなたが私に何をするか見てみましょう! ,$m_a); このパターンは「中国語...」と一致するのが非常に簡単です。