我知道mb_trim
没有trim
版本。我已经链接了十几篇关于如何使用preg_replace
实现一篇文章的文章。
我的问题是,通常trim
默认字符mb是否安全?也就是说,是否存在以单字节空格字符代码结尾的多字节字符的任何示例?
答案 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