ホームページ >バックエンド開発 >PHPの問題 >PHP正規マッチング中国語文字化け問題

PHP正規マッチング中国語文字化け問題

藏色散人
藏色散人オリジナル
2020-09-30 09:38:143288ブラウズ

PHP の正規表現で中国語の文字化けに一致する場合の解決策: まず PHP コード ファイルを開き、次に UTF8 修飾子をコード ファイルに追加します。正規表現ステートメントは "preg_replace('/[万]/ など) です。 u','wan',$a);"。

PHP正規マッチング中国語文字化け問題

推奨: 「PHP ビデオ チュートリアル

具体的な質問:

正規表現を使用して PHP 文字列内の中国語の文字と一致させると文字化けが発生する

<?php
echo &#39;<h2>正则表达式匹配中文</h2><br>&#39;;
$a = &#39;天地不仁,以万物为刍狗&#39;;
$b = preg_replace(&#39;/万/&#39;,&#39;萬&#39;,$a);
echo $b;
echo &#39;<h2>加上方括号后替换结果出现乱码</h2><br>&#39;;
$c = &#39;天地不仁,以万物为刍狗&#39;;
$d = preg_replace(&#39;/[万]/&#39;,&#39;萬&#39;,$a);
echo $d;
 ?>

上記のプログラムの結果は、http://nyaii.com/s/test で確認できます。 php.一致する漢字に角括弧を追加すると、何らかの理由で文字化けが発生します。同じ状況で、JavaScript で実行するとすべてが正常に動作します。

 &#39;天地不仁&#39;.replace(/[天]/,&#39;&#39;)
 //outputs "地不仁"

解決策:

UTF8 修飾子を追加

$d = preg_replace(&#39;/[万]/u&#39;,&#39;萬&#39;,$a);

他の修飾子については、

# を参照してください。 ##http://php.net/manual/en/reference.pcre.pattern.modifiers.php

##以下はトピックのコメントの質問に対する補足内容です

# についてなぜ [] 内に u 修飾子を追加する必要があるのか​​という疑問ですが、実際、厳密に言えば、両方の状況で u 修飾子を追加するのが最善です

しかし、なぜ [] が文字化けを引き起こすのでしょうか? これが必要です文字レベルではなくバイトレベルから説明します。

まず第一に、PHP 文字列は Unicode で保存されていないことがわかっています。次に、このコードを見てみましょう。

<?php
$a = "万";
echo strlen($a); //3
for ($i = 0; $i < strlen($a); $i++) {
    echo dechex(ord($a[$i])) . &#39; &#39;; //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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。