2017-11-20 12 views
0

特殊文字を削除するPHPスクリプトがありますが、残念ながら一部の中国語も削除されています。PHP str_replaceが意図せずに中国語を削除する

<?php 

function removeSpecialCharactersFromString($inputString){ 
    $inputString = str_replace(str_split('#/\\:*?\"<>|[]\'_+(),{}’! &'), "", $inputString); 
    return $inputString; 
} 

$test = '赵景然 赵景然'; 
print(removeSpecialCharactersFromString($test)); 

?> 

奇妙なことに、出力は赵然 赵然です。文字が削除されました

さらに、陈 一も削除されました。考えられる原因は何でしょうか?

+1

'str_replace'がマルチバイトでも安全ではありません。代わりに 'preg_replace()'を使用してください。 – Simba

+0

私はこのデータをエンコードするためにUTF8を使用しているとは思いません。なぜならマルチバイトではない文字列関数を使用していても、フィルタ文字列で指定したような低次のシングルバイトシーケンス長いUTF8シーケンスで発生します。しかし、あなたのデータが実際にUTF16でエンコードされていれば、ほとんどのアジア系スクリプトにとって最も効率的です。 – Sammitch

答えて

1

あなたが置きたいもののリストとして機能するために使用する文字列は、混合エンコーディングではうまく機能しません。私がやったことは、この文字列をUTF16に変換して分割することです。

与え
function removeSpecialCharactersFromString($inputString){ 
    $inputString = str_replace(str_split(
      mb_convert_encoding('#/\\:*?\"<>|[]\'_+(),{}’! &', 'UTF16')), "", $inputString); 
    return $inputString; 
} 
$test = '#赵景然 赵景然'; 
print(removeSpecialCharactersFromString($test)); 

...ところで

赵景然赵景然 

からstr_replaceはMBが安全である - ソートのポスターを認識し... http://php.net/manual/en/ref.mbstring.php#109937

関連する問題