php 修剪 mb 安全吗

los*_*kah 4 php unicode trim utf mbstring

我知道没有mb_trim这个版本trim。我有十几篇文章的链接,介绍如何使用preg_replace.

我的问题是,通常trim使用默认字符 mb 安全吗?也就是说,是否有以单字节空白字符代码结尾的多字节字符的示例?

use*_*918 5

这取决于您所讨论的编码。例如,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))
);
Run Code Online (Sandbox Code Playgroud)

输出:

string(4) "6100"
string(2) "61"
string(4) "0061"
string(2) "61"
Run Code Online (Sandbox Code Playgroud)

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

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