PHP の正規表現で中国語の文字化けに一致する場合の解決策: まず PHP コード ファイルを開き、次に UTF8 修飾子をコード ファイルに追加します。正規表現ステートメントは "preg_replace('/[万]/ など) です。 u','wan',$a);"。
推奨: 「PHP ビデオ チュートリアル 」
具体的な質問:
正規表現を使用して PHP 文字列内の中国語の文字と一致させると文字化けが発生する
<?php echo '<h2>正则表达式匹配中文</h2><br>'; $a = '天地不仁,以万物为刍狗'; $b = preg_replace('/万/','萬',$a); echo $b; echo '<h2>加上方括号后替换结果出现乱码</h2><br>'; $c = '天地不仁,以万物为刍狗'; $d = preg_replace('/[万]/','萬',$a); echo $d; ?>
上記のプログラムの結果は、http://nyaii.com/s/test で確認できます。 php.一致する漢字に角括弧を追加すると、何らかの理由で文字化けが発生します。同じ状況で、JavaScript で実行するとすべてが正常に動作します。
'天地不仁'.replace(/[天]/,'') //outputs "地不仁"
解決策:
UTF8 修飾子を追加
$d = preg_replace('/[万]/u','萬',$a);
他の修飾子については、
##以下はトピックのコメントの質問に対する補足内容です
# についてなぜ [] 内に u 修飾子を追加する必要があるのかという疑問ですが、実際、厳密に言えば、両方の状況で u 修飾子を追加するのが最善です しかし、なぜ [] が文字化けを引き起こすのでしょうか? これが必要です文字レベルではなくバイトレベルから説明します。 まず第一に、PHP 文字列は Unicode で保存されていないことがわかっています。次に、このコードを見てみましょう。<?php $a = "万"; echo strlen($a); //3 for ($i = 0; $i < strlen($a); $i++) { echo dechex(ord($a[$i])) . ' '; //e4 b8 87 }単語「10,000」の utf8 16 進エンコーディングを取得できます。 e4b887そのため、utf8 修飾子がオンになっていない場合、正規表現エンジンは「10,000」を独立した文字としてではなく、3 バイトの連続データとして扱います。 結論は次のとおりです: 一致する [] がない場合は、16 進エンコード値 e4 b8 87 を持つ 3 つの連続する文字を探します。つまり、実際のパターンは \xe4\xb8\x87 ですが、この種の連続文字が文字列内に出現する場合、単語 "Wan" のみが一致するため、置換後に文字化けは発生しません。ただし、文字列に絵文字などの 4 バイトの utf8 エンコード文字も含まれている場合は、問題が発生する可能性があります。Wan の外側で [] をラップすると、正規表現エンジンが実際に探しているものは [\xe4 \xb8\x87]. 正規表現を理解している人は、これが実際にこれら 3 つの文字のいずれかに一致することがすぐにわかるため、現時点では 1 万文字を除く他の中国語の文字に影響を及ぼします。 , 「Wan」は正規表現によって独立した文字として扱われるため、この問題は発生しなくなります。JavaScript については、文字をエンコードしているため、ネイティブの Unicode であり、各文字は 1 つの文字として扱われます。バイトデータに分割するのではなく文字を使用するため、この問題は発生しません
以上がPHP正規マッチング中国語文字化け問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。