子字符串导致不可打印的字符
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.
作为在平面文件中插入产品名称的一部分,我必须将它们截断为最多 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.