PHP乱搞HTML Charset Encoding

时间:2011-09-21 14:53:30

标签: php encoding utf-8 character-encoding

我有这个非常奇怪的问题。我有一个包含一些德语字母的网站,当它只有没有php的html时,符号是带有编码的属性,当我将它改为UTF-8时,它们不显示而不是Ö我得到 。当我将html放入php并使用charset = iso-8859-1编码在Wamp上使用Zend studio时,我得到了�而不是Ö(我想补充一点,这是Ö是一个单选按钮的值) 。当它在

标签中时,它会正确显示。你能告诉我如何解决这个问题吗?我查看其他网站,他们有UTF-8编码并正确显示相同的符号。我试图改变php edior编码,但我认为并不重要 - >一切都在Zend Studio的编辑器中正确显示......提前谢谢。

4 个答案:

答案 0 :(得分:4)

您可能已经开始混合编码类型。 例如。以iso-8859-1发送但从MySQL或XML获取UTF-8文本编码的页面通常会失败。

要解决此问题,您必须根据您选择使用内部编码的类型来控制输入生态类型。

如果您将其作为iso-8859-1发送,您的用户输入也是iso-8859-1。

header("Content-type:text/html; charset: iso-8859-1");

如果mysql发送latin1,则无需执行任何操作。

但是如果你的输入不是iso-8859-1,你必须在它发送给用户之前转换它,或者在它存储之前将它改编为Mysql。

mb_convert_encoding($text, mb_internal_encoding(), 'UTF-8'); // If it's UTF-8 to internal encoding

简短表示您必须始终将输入转换为适合内部编码并使用更严格的输出来匹配外部编码。


这是我选择使用的内部编码。

mb_internal_encoding('iso-8859-1'); // Internal encoding

这是我使用的代码。

mb_language('uni'); // Mail encoding
mb_internal_encoding('iso-8859-1'); // Internal encoding
mb_http_output('pass'); // Skip

function convert_encoding($text, $from_code='', $to_code='')
{
    if (empty($from_code))
    {
        $from_code = mb_detect_encoding($text, 'auto');
        if ($from_code == 'ASCII')
        {
            $from_code = 'iso-8859-1';
        }
    }

    if (empty($to_code))
    {
        return mb_convert_encoding($text, mb_internal_encoding(), $from_code);
    }
    return mb_convert_encoding($text, $to_code, $from_code);
}

function encoding_html($text, $code='')
{
    if (empty($code))
    {
        return htmlentities($text, ENT_NOQUOTES, mb_internal_encoding());
    }

    return mb_convert_encoding(htmlentities($text, ENT_NOQUOTES, $code), mb_internal_encoding(), $code);
}
function decoding_html($text, $code='')
{
    if (empty($code))
    {
        return html_entity_decode($text, ENT_NOQUOTES, mb_internal_encoding());
    }

    return mb_convert_encoding(html_entity_decode($text, ENT_NOQUOTES, $code), mb_internal_encoding(), $code);
}

答案 1 :(得分:1)

您可以查看响应标头中HTTP标头字符集的值。虽然信息很旧(2009),但我不知道它是否仍然存在:如果你没有提供带charset的内容类型标题,PHP中的默认字符集是UTF-8。 Source

因此明确设置标题:

header("Content-type:text/html; charset: iso-8859-1");

答案 2 :(得分:0)

已更新我需要解密编码/解码。

当您使用PHP时,请尝试在输出之前解码UTF-8中的字符串。

$str = 'I ãm UTF-8';
echo(utf8_decode($str));

这对我有用:

<?php $str = 'I ãm UTF-8: ÖMG!'; ?>
Test: <input type = 'text' value = '<?php echo(htmlspecialchars(utf8_decode($str))); ?>'>

输入值(通过剪切粘贴):

  

我是UTF-8:ÖMG!

答案 3 :(得分:-4)

为什么不使用

&Ouml; 

而不是你的Ö?