UTF-8 字符在 <td> 元素中显示不佳

UTF-8 char is not showing well in <td> elements

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

我有以下字符串:

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

首先,我删除 html 个实体:

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

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

嗯,从逻辑上讲,我用过:

$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>";
   }

有效 但是 特殊字符显示为 ?在黑盒子里(编码问题)。

很奇怪的地方,就是我放在<td>个元素里,显示的很好,还有没有 编码问题 !

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

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

更新

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

示例:

这将显示编码问题字符:

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

但是这样的话,它会显示 ë:

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

一些添加到 dinesh123 答案:

  • 尝试 trim html strip_tags 在你得到一个字符串 ($sString)
  • 检查文件编码
  • 尝试在文件开头设置 header("Content-Type:text/html; charset=UTF-8")

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);