strlen&special chars

Tim*_*Tim 2 php wordpress

我在这里找到一个解决方案的问题..我正在为一个客户端开发一个WordPress主题,它使用一个for()循环遍历页面的标题,因此它可以用<span>s 包装并垂直显示..循环使用strlen()到找到标题的长度,但由于某些页面标题中包含"..."或标题中的逗号,它会返回html字符而不是......我无法弄清楚是什么导致了这一点,而且每一次努力都是通过htmlspecialchars_decode()html_entity_decode()不是工作..有什么建议吗?我现在知道的for循环有什么问题吗?

由于这里要求的是实际代码:

$p_title = get_the_title($port_page->ID);
   $title = '';

   for($i=0;$i<strlen($p_title);$i++){
   if(($p_title[$i])){
     $title .="<span>$p_title[$i]</span>";
    }
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用mb_strlen ..搜索要替换的特定字符的问题不一定能解决问题,因为页面标题是由网站所有者任意设置的.

奇怪的是标题没有以任何方式编码,并且通常在for循环之前回显.所以就好像有东西在转换它一样.

Jam*_*s C 5

这听起来很像多字节字符的字符编码问题。您可以尝试替换strlen()mb_strlen()并查看它是否可以完成工作吗?

http://php.net/manual/en/function.mb-strlen.php


Oli*_*ton 5

strlen()仅返回字符串中的字节数.一些特殊字符可以用多个字节表示,Unicode也可以使单个"字符"像版权符号("©")占用许多字符(例如&copy;).

例如,您的"..."(省略号)可以是Unicode中特殊字符.

我建议快速而肮脏的解决方案:

// Example string should be 1 character long, 6 bytes
$text = "&copy;";
$bytes = strlen($text);

mb_internal_encoding('UTF-8');    
$text = html_entity_decode($text, ENT_QUOTES, "UTF-8");                 
$length = mb_strlen($text);

print "String is ".$length." characters long, ".$bytes." bytes long";
Run Code Online (Sandbox Code Playgroud)

请注意,我假设您的字符串已经是UTF-8.如果不是,请先转换它.