HTML文档的字符编码未声明问题

5
我做了一个表单,用户可以填写并检查用户是否正确插入电子邮件。
  • 如果返回false:用户将看到错误消息。
  • 如果返回true:它将向用户显示确认消息,但还将在数据库中插入数据。
当我尝试在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>';
}
?>

由于变量和类与我工作的公司有很强的关系,所以我不得不将它们重命名。

编辑:在Firefox中使用Firebug时,控制台日志会产生此错误。

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

编辑3:我试图找出我的代码中到底是什么导致了这个错误,因为我使用Dobromir Velev提供给我的测试用例测试编码部分,并且结果完全正确。我决定注释掉IF ELSE语句,然后就没有错误了。因此,这似乎会破坏页面。

我暂时删除了echo,因为它对这个特定的挑战没有任何价值。

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;
}

2
你在哪里看到那个消息,是什么产生了它? - deceze
1
希望你没有真的把函数命名为 function?(function($_POST['1']);)。这样做可能会破坏一些代码,因为 function 是一个保留关键字。 - Jelmer
1
@MarioS 抱歉我错过了那个。至少给它们一个代表函数的描述性名称。这样我们就可以猜测数据如何被改变,也许这会帮助我们回答你的问题。 - Jelmer
3
你是否正确设置了字符集头信息?在Firebug网络选项卡的响应头中能看到吗? - deceze
一些问题:Q1)您正在使用哪种输出编码?Q2)在您的输出中,哪个二进制序列导致了Firefox中的错误消息(无效序列的确切数量、它们的字节偏移和它们的字节序列)。Q3)这些无效的字节序列来自哪里? - hakre
显示剩余3条评论
2个回答

1
我会从尝试同时包含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>

如果这不触发错误,那么很可能是你的代码中出了问题。例如,在<?php标签之前的空格将阻止PHP设置HTTP头。此外,如果包含文件file1.php或file2.php返回任何内容,可能会导致浏览器错误地检测编码。

我认为数据没有通过包含传递,它们只包含一些函数。 - Mario S
检查HTTP响应头 - 有时HTTP服务器可能会修改编码。 - Dobromir Velev
我进行了测试,没有出现任何复杂情况(正如我预期的那样)。但是,我确实确定了产生错误的代码片段。原帖中有更详细的解释。顺便加一分 :) - Mario S

1

在 PHP 聊天中进行了一些讨论,似乎问题来自于额外的分号。

来自:

mysql_query(); or die();

收件人:

mysql_query() or die();

谢谢Touki!这确实是问题所在。太愚蠢了,居然忽略了这个错误。 - Mario S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接