【问题标题】:UTF-8 char is not showing well in <td> elementsUTF-8 字符在 <td> 元素中显示不佳
【发布时间】:2015-05-06 08:49:33
【问题描述】:

我有一个奇怪的问题...

我有以下字符串:

$sString = "This is my encoded string &eacute; &agrave;";

首先,我删除 html 实体:

$sString = html_entity_decode($sString, ENT_COMPAT, 'UTF-8');

我想要的是正确拆分此字符串,以在同一表行的不同列中显示每个字符。

嗯,从逻辑上讲,我使用了:

$aString = str_split($sString) // Fill an array with each char

它不起作用。它在框中显示字符,因为我没有使用 html_entity_decode...

所以,我决定尝试以下方法:

   for($i = 0; $i < 16; $i++) {
     echo "<td>";
     echo $sLine1[$i];
     echo "</td>";
   }

它可以使用特殊字符,如 ?在黑盒子里(编码问题)。

真正奇怪的地方在于,当我把它放在&lt;td&gt;元素中时,它显示得很好,而且没有编码问题!

我的 HTML 页面包含 UTF-8 的字符集并且格式正确(包括 doctype、html、body 等...)

我不得不承认,在这一点上,我不知道这个问题是从哪里来的......

更新

我刚刚意识到,当我在&lt;td&gt; 之外逐个字符显示时,它也不起作用。编码的字符需要成对工作! 这对我来说是个问题,因为字符串来自数据库,特殊字符并不总是在同一个地方!

示例:

这将显示编码问题char:

$sString = "Paëlla";
echo $sString[3];

但是这样一来,就会显示ë

$sString = "Paëlla";
echo $sString[3];
echo $sString[4]; 

【问题讨论】:

    标签: php html encoding utf-8


    【解决方案1】:

    str_split 按字节拆分字符串。但是在 UTF-8 中,像 é 和 à 这样的字符是在 2 个字节的序列上编码的。您需要使用 mbstring 来识别 UTF-8。

    mb_internal_encoding('UTF-8');
    
    function mb_str_split($string, $length = 1) {
        $ret = array();
        $l = mb_strlen($string);
    
        for ($i = 0; $i < $l; $i += $length) {
            $ret[] = mb_substr($string, $i, $length);
        }
    
        return $ret;
    }
    

    如果您将[offset] 应用于字符串,则相同:如果字符串的字符集可能将字符编码为超过一个字节,您将得到一个字节,而不是字符。在这种情况下,请使用mb_substr

    mb_internal_encoding('UTF-8');
    
    echo mb_substr("Paëlla", 2, 1);
    

    【讨论】:

    • 实际上最多 4 个字节。
    【解决方案2】:

    一些添加到 dinesh123 答案:

    • 在获得字符串 ($sString) 之前尝试修剪 html strip_tags
    • 检查文件编码
    • 尝试在文件开头设置 header("Content-Type:text/html; charset=UTF-8")

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2012-01-11
      • 2011-06-15
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多