2016-09-21 7 views
1

私はtrimmb_trimバージョンがないことを知っています。 preg_replaceを使用して実装する方法に関する記事のダースへのリンクがあります。php trim mb safe

私が持っている質問は、普通の文字はmbで安全です。trimですか?つまり、シングルバイトの空白文字コードで終わるマルチバイト文字の例はありますか?

答えて

2

あなたが話しているエンコーディングによって異なります。 UTF-16LEとUTF-32LEの両方にヌルバイトで終わるトン数があります。たとえば、trimはデフォルトで削除されます。

文字列「」UTF-16LEはバイトで構成さで0x610x00、およびtrimはちょうど0x61を残しNULLバイトを削除します。

この問題は別の方法でも起こります。trimは、文字列の先頭から末尾までのバイトを削除します。文字列 "a"がUTF-16BEの場合、0x000x61としてコード化されます。trim0x61のままになります。


例:

$utf16le = iconv("ASCII", "UTF-16LE", "a"); 
$utf16be = iconv("ASCII", "UTF-16BE", "a"); 

var_dump(
    bin2hex($utf16le), 
    bin2hex(trim($utf16le)), 
    bin2hex($utf16be), 
    bin2hex(trim($utf16be)) 
); 

出力:

​​

だけUTF-8心配している場合は、ノー、競合が存在しません。これはASCII互換で、UTF-8のすべてのシングルバイト文字は0xxx xxxxの形式で、マルチバイト文字のすべてのバイトは最上位ビットが1xxx xxxxに設定されているため、あいまいさはありません。 UTF-8の場合trimデフォルト文字マスクを使用すると安全です。

他のエンコーディングについて心配している場合は、エンコーディングが何であるかによって異なります。 trimの文字マスクの一部としてマルチバイト文字を使用しようとすると、各バイトが個別に扱われるので、間違いなく問題が発生します。

0

デフォルトの文字マスク(空白+ \t\n\r\0\x0B)の文字はASCIIなので、trim()をマルチビット文字列で使用することは安全です。

trim(' 漢字は '); // ok 

マルチバイト文字を含む文字マスクは問題を引き起こします。

trim('はは漢字はは', 'は'); // bad 
+0

完全に文字列のエンコーディングに依存します。 UTF-8文字列でのデフォルトの文字マスクの使用は問題ありませんが、文字列がUTF-16またはUTF-32の場合は安全ではありません。 –

+0

ありがとう、それについて考えていない。クールな答え。 –