1

こんにちは、次の問題が発生しました

最初: ÄÖÜ に正規表現が提供されている場合、商標記号の置換により追加の文字が生成されます。:

2 番目: 結果に対して文字列ループを実行すると、すべての特殊文字が � になります。

問題は、なぜこれが起こるのか、そしてそれに対して何ができるのかということです. (2番目の質問はそれほど必要ではありませんが興味深いです)

header('Content-Type: text/html; charset=utf-8');
$testtxt = 'MicrÖsüft W!ndows® is a trÄdemark of Microfrost™ ©2012!';

$r =  preg_replace('#[^\w\s\däöüß%\!\?\.,\:\-_\[\]ÄÖÜ]#is', 'X', $testtxt);
echo $testtxt, '<br>', $r;
echo '<hr>';
for($i = 0, $size = strlen($r); $i < $size; ++$i) {
    echo $r[$i], '=', ord($r[$i]), '<br>';
}

結果:

MicrÖsüft W!ndows® is a trÄdemark of Microfrost™ ©2012!
MicrÖsüft W!ndowsXX is a trÄdemark of MicrofrostX�X XX2012!
M=77
i=105
c=99
r=114
�=195
�=150....

期待される:

MicrÖsüft W!ndows® is a trÄdemark of Microfrost™ ©2012!
MicrÖsüft W!ndowsXX is a trÄdemark of MicrofrostXX XX2012!
M=77
i=105
c=99
r=114
Ö=195
s=150....
4

2 に答える 2

2

マルチバイト文字と互換性のないstrlenおよびord関数を使用しています。次のコードは、1文字あたりのバイト数を示しています。

for($i = 0, $size = mb_strlen($r); $i < $size; ++$i) {
    echo $r[$i], '=', strlen($r[$i]), '<br>';
}

次に、正規表現にUTF-8修飾子を追加する必要があります。

$r =  preg_replace('#[^\w\s\däöüß%\!\?\.,\:\-_\[\]ÄÖÜ]#isu', 'X', $testtxt)
于 2012-06-25T17:34:36.283 に答える
0

よくわかりませんが、「u」修飾子を preg_replace() の正規表現に追加してみてください。または、mb_eregi_replace()を使用してみてください。

また、ord() を使用してもよろしいですか? ASCII値を返すとマニュアルに書かれています(これは、マルチバイト文字の場合、最初のバイトの値を返すことを意味していると強く思います)。

于 2012-06-25T17:15:44.500 に答える