一尘不染

PHP将HTML Charset编码弄乱了

php

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

标签以正确显示。您能告诉我如何解决此问题。我查看了其他站点,它们具有UTF-8编码并正确显示相同的符号。我试图更改php
edior编码,但我想没关系->一切都在Zend Studio的编辑器中正确显示…预先谢谢。


阅读 260

收藏
2020-05-29

共1个答案

一尘不染

您可能已经来混合编码类型了。例如。以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);
}
2020-05-29