【问题标题】:'The character encoding of the HTML document was not declared' issues“未声明 HTML 文档的字符编码”问题
【发布时间】:2012-12-13 16:28:41
【问题描述】:

我制作了一个用户可以填写的表单,它会检查用户是否正确插入了电子邮件。

  • 如果返回 false:用户会看到错误消息。
  • 如果它返回 true:它会向用户显示一条确认消息,但它也会 INSERT 将数据输入数据库。

所以当我尝试在 PHP 文件中添加表单时出现问题,以便我可以发出警报或在同一页面上向用户提供错误消息。我开始收到此错误:

未声明 HTML 文档的字符编码。如果文档包含 US-ASCII 范围之外的字符,则文档将在某些浏览器配置中呈现乱码。页面的字符编码必须在文档或传输协议中声明。

所以我尝试通过恢复到旧版本来恢复它,我不得不剪切和粘贴几段代码,但没有太复杂。出于某种奇怪的原因,我仍然收到此错误。自然地,我在 Stackoverflow 上查看了关于这个问题的类似主题,但没有一个答案让我更进一步。例如在页面头部添加meta信息,我还创建了一个这样的PHP头部:header('Content-type: text/html; charset=utf-8');之后我阅读了一些关于这个错误的文章,但没有一个帮助我解决这个问题。

这是我的代码示例。我在这个页面上得到了错误:

 <?php    
include_once('credentials.php');
mysql_connect($host, $user, $pass) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
include_once('functions.php');

 $apples = sanitize($_POST['Apple']);
 $oranges = sanitize($_POST['Orange']);
 $melons = sanitize($_POST['Melon']);
 $pears = sanitize($_POST['Pear']);
 $strawberries = sanitize($_POST['Strawberry']);
 $grapes = sanitize($_POST['Grape']);               
    if($_POST['Grape'] == 'Yes')
    { $grapes = 1; }
    else
    { $grapes = 0; } 
$blueberries = sanitize($_POST['Blueberry']);

if (checkStrawberries($strawberries) == true) {    
    mysql_query("   INSERT INTO tablename (Name, Weight, Color, Ripeness, Age, Origin, Destination) 
            VALUES ('$apples', '$oranges', '$melons', '$Pears', '$strawberries', '$grapes', '$blueberries') ");

    or die(mysql_error()); 

    echo '<!DOCTYPE html>   
            <html>
                <head>
                    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
                </head>
                <title>Page</title>
                <body>
                    True
                    <a href="../index.php">home</a>
                </body>
            </html>';
} else {
    echo '<!DOCTYPE html>   
            <html>
                <head>
                    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
                </head>
                <title>Pagina</title>
                <body>
                    False
                    <a href="../index.php">home</a>
                </body>
            </html>';
}
?>

我不得不重命名变量和类,因为它们与我工作的公司关系密切。

编辑:此错误是由使用 Firebug 的 Firefox 中的控制台日志产生的。

编辑 2:更改了 var 和函数名称以避免混淆并说明此应用程序中的数据交换。

编辑 3:我试图弄清楚我的代码中究竟是什么导致了这个错误,因为我使用 Dobromir Velev 下面提供给我的测试用例测试了编码部分,并且效果很好.我决定注释掉 IF ELSE 语句并且我没有收到错误。所以这似乎破坏了页面。

我暂时移除了回声,因为它没有为这个特殊的挑战增加任何价值。

if (checkStrawberries($strawberries) == true) {    
    mysql_query("INSERT INTO tablename (Name, Weight, Color, Ripeness, Age, Origin, Destination) 
    VALUES ('$apples', '$oranges', '$melons', '$Pears', '$strawberries', '$grapes', '$blueberries') ");
    or die(mysql_error());
} else {
    echo 'FALSE';
}

函数checkStrawberries是这样的:

function checkEmail($email) {
if (!preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $email)) {
return false;
}
return true;
}

sanitize 函数是这样的:

function sanitize($dirty){
$clean = htmlspecialchars($dirty);
$cleaner = mysql_real_escape_string($clean);
return $cleaner;
}

【问题讨论】:

  • 您在哪里看到该消息,是什么产生的?
  • 我希望你没有真正命名你的函数function? (function($_POST['1']);)。这也可能会弄乱一些代码,因为function 是保留关键字。
  • @jelmer 我已经说过我必须更改一些关于变量和函数名称的事情。这是由于保密协议。
  • @MarioS 对不起,我错过了。至少给他们一个代表功能的描述性名称。所以我们可以猜测数据是如何变化的,也许它会帮助我们回答你的问题。
  • 那么,您是否正确设置了字符集标题?您可以在 Firebug 网络选项卡的响应标头中看到它吗?

标签: php html character-encoding meta-tags


【解决方案1】:

经过PHP聊天的一些讨论,问题似乎来自额外的分号

发件人:

mysql_query(); or die();

收件人:

mysql_query() or die();

【讨论】:

  • 谢谢 Touki!这确实是问题所在。如此愚蠢的错误不容忽视。
【解决方案2】:

我会先尝试一个包含 HTTP 标头和元标记的文件。

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

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

如果这不会触发错误,则可能是您的代码中的某些内容。例如,&lt;?php 标签前的空格会阻止 PHP 设置 HTTP 标头。此外,如果包含文件 file1.php 或 file2.php 返回任何内容,可能会导致浏览器检测到编码错误

【讨论】:

  • 我不认为数据是通过包含传递的,它们只包含一些函数。
  • 检查 HTTP 响应标头 - 有时 HTTP 服务器可能会修改编码
  • 我对此进行了测试,并没有产生任何并发症(正如我所料)但是我确实确定了产生错误的代码段。原帖中有更详细的解释。顺便说一下 +1 :)
猜你喜欢
  • 2015-12-05
  • 2014-09-12
  • 2012-07-22
  • 2012-11-09
  • 2014-08-27
相关资源
最近更新 更多