php trim mb是否安全

时间:2016-09-21 12:59:35

标签: php unicode trim utf mbstring

我知道mb_trim没有trim版本。我已经链接了十几篇关于如何使用preg_replace实现一篇文章的文章。

我的问题是,通常trim默认字符mb是否安全?也就是说,是否存在以单字节空格字符代码结尾的多字节字符的任何示例?

2 个答案:

答案 0 :(得分:3)

这取决于你所谈论的编码。 UTF-16LE和UTF-32LE都有大量以空字节结尾的字符,例如trim默认删除。

UTF-16LE中的字符串“a”由字节0x61 0x00组成,而trim将删除仅留下0x61的空字节。

请注意,此问题也是另一种方式,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))
);

输出:

string(4) "6100"
string(2) "61"
string(4) "0061"
string(2) "61"

如果您只担心UTF-8,那么没有任何冲突。它与ASCII兼容,UTF-8中的所有单字节字符都是0xxx xxxx的形式,而多字节字符的所有字节都设置了最高有效位1xxx xxxx,因此没有歧义。使用UTF-8 trim使用其默认字符掩码是安全的。

如果你担心其他编码,那么它将取决于它们是什么。如果你尝试使用多字节字符作为trim字符掩码的一部分,你肯定会遇到问题,因为每个字节都将被单独处理。

答案 1 :(得分:0)

由于默认字符掩码(空格+ \t\n\r\0\x0B)中的字符是ASCII,因此使用带有多字符串的trim()是安全的。

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

具有多字节字符的字符掩码会导致问题。

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