试图摆脱一些字符utf8_encode不会修复

时间:2013-01-01 17:30:16

标签: php encoding

我在一个网站上有一些地方,我正在制作标题有些棘手的地方

我尝试过使用utf8_encodehtml_entity_decode(stripslashes($title),ENT_QUOTES, "UTF-8")以及其他一些无效的解决方案。我似乎无法摆脱它们:这是一个例子:

在尝试之前

标题:

New Era Miami Dolphins NFL® 9FIFTY� Solid Snap Miami Dolphins - Zappos.com Free Shipping BOTH Ways

这是在utf8_encode和html实体之后

New Era Miami Dolphins NFL® 9FIFTY⢠Solid Snap Miami Dolphins - Zappos.com Free Shipping BOTH Ways

它仍然存在问题 - 有没有办法摆脱那些?

2 个答案:

答案 0 :(得分:0)

看起来您拥有的标题是UTF-8编码,但您嵌入的HTML页面实际上并未标记为UTF-8,因此浏览器使用默认字符集解释文本,可能是ISO-8859-1。

假设页面上的所有文本实际上都是UTF-8(或US-ASCII,它是其中的一个子集),最简单的解决方案是只发送相应的HTTP标头(和/或元标记)表示正确的字符集。特别是,在PHP中你可以这样做:

header( "Content-Type: text/html; charset=utf-8" );

或者您可以在HTML代码的head部分中包含等效的元标记:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

或者,在HTML5中,只需:

<meta charset="utf-8">

答案 1 :(得分:0)

你总是可以从wordpress(seem_utf8)借用函数并根据你的需要进行修改:

function remove_none_utf8($str) {
    $ret = '';

    $length = strlen($str);

    for ($i=0; $i < $length; $i++) {
            $ok = true;

        $c = ord($str[$i]);

        if ($c < 0x80) $n = 0; # 0bbbbbbb

        elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb

        elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb

        elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb

        elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb

        elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b

        else continue; # Does not match any model


        for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?

            if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80)) {
                            $ok = false;

                continue;
                    }

        }
            if ($ok === true) $ret .= $str[$i];

    }

    return $ret;

}

所以你可以像这样使用它:

$str = "New Era Miami Dolphins NFL® 9FIFTY� Solid Snap Mi";
echo remove_none_utf8($str);