著者: 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","I am a Chinese Character, let's see what you do to me!",$m_a);
欲しい「汉」、「字」、または「漢字」の出現に一致します。これにより、マッチング結果が文字化けし、無限ループが発生する可能性があります。なぜこのようなことが起こるのでしょうか?これは、PHP が内部で UNICODE を使用しておらず、マルチバイト テキストをサポートしていないため、パターン マッチングでは「漢字」が 4 バイトの ASCII として扱われるためです。エラーが発生しないのはおかしいでしょう。
その後、パターン マッチングを書き直そうとしたところ、問題を解決できそうな (なぜらしいと言うのか? 後で見てみましょう) メソッドを見つけました:
preg_match_all("/(汉|字)+/ism", 「私は中国人です、見てください、あなたは私に何をしているのですか!」、$m_a);
このように書くと、「汉」、「字」、または「汉字」に一致し、結果は $m_a
Array
(
[ 0] => 配列
(
[ 0] => 漢字
)
[1] => 配列
(
[0] => 漢字
)
)
完全に一致する文字列が表示されるのはどうでしょうか。しかし、喜ぶのはまだ早く、実際に使用すると問題が発生することがよくあります。もう一度問題を探したところ、ついに問題の根本が見つかりました。 PHP はマルチバイトテキストをサポートしていないため、内部コード変換後にパターンマッチングと文字操作が実行されます (これが正しいかどうかはわかりません)。例は次のとおりです:
eregi_replace("性","No " , " Responsible"); この操作は、文字列 "Responsible" 内の "gender" という単語を "no" に置き換えることです。最終的な結果はどうなりますか? 「責任感」に「性別」はないので、置換操作を実行せずに「責任感」を返すはずが、結果は「責任感」だった!