【问题标题】:PHP messing with HTML Charset EncodingPHP 搞乱了 HTML 字符集编码
【发布时间】:2011-09-21 14:53:29
【问题描述】:

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

标记它正确显示。你能告诉我如何解决这个问题。我查看了其他站点,它们具有 UTF-8 编码并正确显示相同的符号。我尝试更改 php edior 编码,但我想没关系 -> Zend Studio 的编辑器中的所有内容都正确显示...提前谢谢您。

【问题讨论】:

  • 标签 german 作为 2012 cleanup 的一部分被删除。

标签: php encoding utf-8 character-encoding


【解决方案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);
}

【讨论】:

【解决方案2】:

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

因此明确设置标题:

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

【讨论】:

  • 连接:保持活动内容类型:文本/html; charset: iso-8859-1 如果它不在输入的(无线电)值内就可以了
【解决方案3】:

更新我需要解开我的编码/解码混淆。

当您使用 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!

【讨论】:

  • 这真的有必要吗?对于像 PHP 这样成熟的东西来说似乎过于笨拙。
  • 1) 避免对 HTML 属性使用单引号。 2)您可能应该对 value 属性进行 html 编码。 -1 用于发布代码,如果逐字使用,将成为跨站点脚本的巨大邀请。
【解决方案4】:

你为什么不使用

&Ouml; 

代替你的Ö?

【讨论】:

  • 这感觉像是一种妥协。 Ö 不需要在 iso-8859-1 或 utf8 中进行实体化。
  • 我尝试使用它但是当它是这样的时候 它显示...。
猜你喜欢
  • 2011-03-13
  • 2017-07-12
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多