子字符串导致不可打印的字符

Substring results in non-printable characters

作为在平面文件中插入产品名称的一部分,我必须将它们截断为最多 50 个字符。

但是,某些产品名称包含带重音符号的字符,如果这些字符位于第 50 位(左右),截断的产品名称将无法正确显示。

这里是重现问题的方法 (PHP):

$tmp = "Kaspersky Anti-Virus 2015 (Renovación) Suscripción Anual 3 PC";
$xxx = substr(trim($tmp), 0, 50);

echo $tmp . PHP_EOL;
echo $xxx . PHP_EOL;

显示:

Kaspersky Anti-Virus 2015 (Renovación) Suscripción Anual 3 PC
Kaspersky Anti-Virus 2015 (Renovación) Suscripci�

如何去掉这些无法显示的字符 �?

您需要使用 mb_substr 而不是 substr:

$tmp = "Kaspersky Anti-Virus 2015 (Renovación) Suscripción Anual 3 PC";
$xxx = mb_substr(trim($tmp), 0, 50);

echo $tmp . PHP_EOL;
echo $xxx . PHP_EOL;

来自文档:

Performs a multi-byte safe substr() operation based on number of characters. Position is counted from the beginning of str. First character's position is 0. Second character position is 1, and so on.