私はtrim
のmb_trim
バージョンがないことを知っています。 preg_replace
を使用して実装する方法に関する記事のダースへのリンクがあります。php trim mb safe
私が持っている質問は、普通の文字はmbで安全です。trim
ですか?つまり、シングルバイトの空白文字コードで終わるマルチバイト文字の例はありますか?
私はtrim
のmb_trim
バージョンがないことを知っています。 preg_replace
を使用して実装する方法に関する記事のダースへのリンクがあります。php trim mb safe
私が持っている質問は、普通の文字はmbで安全です。trim
ですか?つまり、シングルバイトの空白文字コードで終わるマルチバイト文字の例はありますか?
あなたが話しているエンコーディングによって異なります。 UTF-16LEとUTF-32LEの両方にヌルバイトで終わるトン数があります。たとえば、trim
はデフォルトで削除されます。
文字列「」UTF-16LEはバイトで構成さで0x61
0x00
、およびtrim
はちょうど0x61
を残しNULLバイトを削除します。
この問題は別の方法でも起こります。trim
は、文字列の先頭から末尾までのバイトを削除します。文字列 "a"がUTF-16BEの場合、0x00
0x61
としてコード化されます。trim
は0x61
のままになります。
例:
$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
の文字マスクの一部としてマルチバイト文字を使用しようとすると、各バイトが個別に扱われるので、間違いなく問題が発生します。
デフォルトの文字マスク(空白+ \t\n\r\0\x0B
)の文字はASCIIなので、trim()
をマルチビット文字列で使用することは安全です。
trim(' 漢字は '); // ok
マルチバイト文字を含む文字マスクは問題を引き起こします。
trim('はは漢字はは', 'は'); // bad
完全に文字列のエンコーディングに依存します。 UTF-8文字列でのデフォルトの文字マスクの使用は問題ありませんが、文字列がUTF-16またはUTF-32の場合は安全ではありません。 –
ありがとう、それについて考えていない。クールな答え。 –