为什么从textarea发送的信件算作两个字母?

时间:2017-07-12 19:53:14

标签: php html

header("Content-type:text/html; charset=utf-8");

$space = "( )";
$test_string = str_replace(" ", " ", $space);

if($_POST["submit"] === "yes")
{
    var_dump($space); echo md5($space);
    echo"<br>";
    var_dump($_POST["box1"]); echo md5($_POST["box1"]);
    echo"<br>";
    var_dump($test_string); echo md5($test_string);
    echo"<br>";
}

$echo = "<form method='post'>".
"<input type='hidden' name='submit' value='yes'>".
"<textarea name='box1'>".$test_string."</textarea><input type='submit' value='SUBMIT'>".
"</form>";
echo"$echo";

如果我点击上面代码中的SUBMIT按钮,我将得到以下输出:

string(3) "( )" 847f697fc150ec24253d12927fe41b75
string(4) "( )" 63679d6d8c5ac6713be008a28ee19616
string(8) "(&nbsp;)" 742fcb328936485cdd13530f39c11bc6

将空格字符计算为单个字符并输出到string(3)

&nbsp;计算为6个字符并输出到string(8)

顺便说一下,从textarea发送的&nbsp; 计算为两个字符并输出到string(4)。即使我将md5()放在此值上,它也会打印一个与string(3)不同的值。

起初,我认为这是一个编码问题,我已经删除了header()部分,但问题仍然存在。

为什么会这样?

2 个答案:

答案 0 :(得分:2)

env delete a_name HTML实体由浏览器的HTML解析器解释,并转换为实际的U + 00A0 NO-BREAK SPACE Unicode字符。然后将其作为字节&nbsp;发送到以UTF-8编码的服务器。一个字符,两个字节。

答案 1 :(得分:0)

无中断空格是非ASCII字符。某些Unicode实现可以为一个字符使用多个字节,允许它们使用比单字节仅ASCII更大的字符集。正在计算这些字节,因为NBSP的代码在UTF-8中是两个字符长。

当您将无休息空间的MD5哈希值与常规空间进行比较时,当然会得到不同的结果 - 它们不是同一个字符!

请在此处查看UTF-8编码,请注意有两个字符: https://en.wikipedia.org/wiki/Non-breaking_space#Encodings