我有一个奇怪的问题......
我有以下字符串:
$sString = "This is my encoded string é à";
首先,我删除了html实体:
$sString = html_entity_decode($sString, ENT_COMPAT, 'UTF-8');
我想要的是正确拆分此字符串以显示同一表格行的不同列中的每个字符。
嗯,从逻辑上讲,我用过:
$aString = str_split($sString) // Fill an array with each char
它不起作用。它在框中显示char,因为我没有使用html_entity_decode ...
所以,我决定尝试以下方法:
for($i = 0; $i < 16; $i++) {
echo "<td>";
echo $sLine1[$i];
echo "</td>";
}
它显示为但是特殊字符?在一个黑盒子里(编码问题)。
这真的很奇怪,当我不将它放在<td>
元素中时,它显示得很好,并且没有编码问题!
我的HTML页面包含UTF-8的字符集并且已正确格式化(使用doctype,html,body等...)
我必须承认,在这一点上,我不知道这个问题出在哪里......
更新
我刚刚意识到,当我在<td>
之外用char显示char时,它也不起作用。编码的char需要成对才能工作!
这对我来说是个问题,因为字符串来自数据库,而且特殊的字符不会总是在同一个地方!
例:
这将显示编码问题char:
$sString = "Paëlla";
echo $sString[3];
但通过这种方式,它将显示ë:
$sString = "Paëlla";
echo $sString[3];
echo $sString[4];
答案 0 :(得分:3)
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);
答案 1 :(得分:0)
添加到dinesh123的一些答案: