PHP函数substr()错误

26

使用substr()时,末尾会出现奇怪字符。

$articleText = substr($articleText,0,500);

жҲ‘жңүдёҖдёӘиҫ“еҮәеҢ…еҗ«500дёӘеӯ—з¬Ұе’ҢпҝҪ <--

еҰӮдҪ•и§ЈеҶіиҝҷдёӘй—®йўҳпјҹиҝҷжҳҜдёҖдёӘзј–з Ғй—®йўҳеҗ—пјҹжҲ‘зҡ„иҜӯиЁҖжҳҜеёҢи…ҠиҜӯгҖӮ


在编程领域中看到过同样的事情(英国英语)。 - alimack
7个回答

61

substr 函数计数时使用的是字节而不是字符。

如果你使用一些多字节编码,比如 UTF-8,那么使用字节计数可能不太合适。

也许在这里使用 mb_substr 更好:做为专门针对多字节编码而创建的 mb_* 函数。


4
每一天都在学习……谢谢stackoverflow! - Boris Delormas
1
非常感谢。但对我来说,最重要的是在使用 mb_* 函数之前添加 mb_internal_encoding("UTF-8");。如果不添加它,我仍然会看到方块。 - ivkremer
@Kremchik 如果你使用 mb_substr($short, 0, 75, 'utf-8'),就不会看到方块了。这样你就不需要在 mb_substr 前使用 mb_internal_encoding - trejder

20

请使用 mb_substr 替代 substr,它能够处理多种编码,而不仅仅是单字节字符串:

$articleText = mb_substr($articleText,0,500,'UTF-8');

2
“UTF-8”对我很重要 - 各位不要忘记它! - user993683
1
"UTF-8"作为可选参数对我起了作用。请记住,如果您使用字符串长度来确定是否必须切割,则可能还需要使用mb_strlen()。 - Kent Munthe Caspersen
2
另一种选择是在任何 mb_* 命令之前使用 mb_internal_encoding('utf-8') - trejder

6

看起来你正在将Unicode字符切成两半。使用mb_substr来进行Unicode安全的字符串切割。


1
在使用mb_substr时,可以在调用mb_internal_encoding('utf-8')之前或使用'utf-8'作为第四个参数。文档中指出这是可选的,如果省略,则将使用内部字符编码值,但问题是(在PHP文档的其他地方解释),PHP的“内部编码”几乎总是“其他东西”,而不是您的页面编码。因此,在切割UTF8字符串时,必须使用第四个参数或调用mb_internal_encoding('utf-8') - trejder

1

0
你正在尝试切割Unicode字符。 因此,我建议在PHP中使用mb_substr()而不是substr()。 < p > < strong > substr()

substr ( string $string , int $start [, int $length ] )

mb_substr()

mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

有关 substr() 的更多信息 - 点此查看


0

UTF-8编码字符串的替代解决方案 - 在截取子字符串之前,将UTF-8转换为字符。

$articleText = substr(utf8_decode($articleText),0,500);

为了将articleText字符串转换回UTF-8,需要进行额外的操作:

$articleText = utf8_encode( substr(utf8_decode($articleText),0,500) );

这根本不起作用。 - gre_gor

0

ms_substr() 函数同样非常适用于删除奇怪的尾随换行符,这是我在解析 HTML 代码后遇到的问题。以下方法无法解决该问题:

 trim() 

或者:

 var_dump(preg_match('/^\n|\n$/', $variable));

或者:

str_replace (array('\r\n', '\n', '\r'), ' ', $text)

不要捕获。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接