昨天在解决memcache的过程中,遇到了字符串截断的问题,虽然分析了原因并没有解决。翻译了关于Joomla UTF-8 的规范,终于明白了问题所在。
如果有兴趣,可以看看这几篇文章:
[翻译] Joomla! UTF-8 规范 (WIP) 一
[翻译]Joomla! UTF-8 规范 (WIP) 二
[翻译]Joomla! UTF-8规范 (WIP) 三
[翻译]Joomla! UTF-8规范 (WIP) 四
在memcache取回字符后,应该采用JString来处理字符串截断,否则就会出现上面规范中说的问题。
应该这样 JString::substr($item->text,0,300) 就不会发生字符串截断,以及出现乱码半个字符的问题了。
同时,还应该注意,文章的正文中是有 html标签的,如果这样截取,会可能出现标签不匹配的显现,严重可能导致页面变形,所以简单写了一个函数,完成标签匹配功能。在Joomla中好像没找到相应的函数,如果以后找到再修改吧。函数的代码如下:
function well_form($xml) {
preg_match_all("/<([^\/>]+)>/", $xml, $begins);
preg_match_all("/<\/([^\/>]+)>/", $xml, $ends);
$begins = $begins[1];
$ends = $ends[1];
for ($i = 0; $i < count($begins); $i++) {
$j = array_search($begins[$i], $ends);
if ($j !== false) {
array_splice($begins, $i, 1);
array_splice($ends, $j, 1);
$i--;
}
}
foreach ($begins as $tag) {
$xml .= "</$tag>";
}
return $xml;
}
截断后的字符,再用上面的函数处理一下,就应该基本不会出现页面错位的情况了。