php rawurlencode()的结果在不同的服务器上有所不同

时间:2014-01-23 11:49:57

标签: php forms urlencode url-encoding rawurl

在专用服务器上:

$_POST['kannada']='ಕನ್ನಡ';
rawurlencode($_POST['kannada']);

给出

%26%233221%3B%26%233240%3B%26%233277%3B%26%233240%3B%26%233233%3B

在我的本地服务器上:

$_POST['kannada']='ಕನ್ನಡ';
rawurlencode($_POST['kannada'])

给出

%E0%B2%95%E0%B2%A8%E0%B3%8D%E0%B2%A8%E0%B2%A1

预期结果是我在本地服务器上获得的结果。为什么这个结果不同?请告诉我。

确定。下面是我在不同服务器上运行的文件。你可以查一下。

<!DOCTYPE html>
<html lang="kn">
<head>
<meta charset="UTF-8" />
</head>
<body>
<form name="submit" method="post">
<input type="text" name="kannada">
<input type="submit" name="submit">
</form>
<?php
if(isset($_POST['submit']))
{
    echo $_POST['kannada']."<br/>";
    echo rawurlencode($_POST['kannada']);
}
?>
</body>
</html>

2 个答案:

答案 0 :(得分:3)

<?php

echo rawurldecode('%26%233221%3B%26%233240%3B%26%233277%3B%26%233240%3B%26%233233%3B') . PHP_EOL;
echo rawurldecode('%E0%B2%95%E0%B2%A8%E0%B3%8D%E0%B2%A8%E0%B2%A1');

...打印:

&#3221;&#3240;&#3277;&#3240;&#3233;
ಕನ್ನಡ

你的两个字符串完全不同,即使在HTML上下文中呈现它们看起来也是一样。


编辑#1:实际上可以在POST变量中获取HTML实体,但这是一个浏览器功能:如果用户键入HTML表单中文档编码不支持的某些字符,浏览器更喜欢生成HTML实体,而不是发送或删除不支持的字符。但是你需要一个浏览器;如果从PHP手动填充$_POST,则不会发生这种情况。


编辑#2:正如我怀疑的那样,您发布的代码不是实际代码。您的输入字符串不一样,但您没有注意到,因为您正在将表单数据操作为HTML:

echo $_POST['kannada']."<br/>";

...因此您的HTML实体被呈现作为HTML。你需要这样做:

echo htmlspecialchars($_POST['kannada'])."<br/>";

其余的就是我已经说过的。您的页面未被解释为UTF-8。确保:

  1. 您的编辑器将文件保存为UTF-8
  2. 网络服务器正在发送正确的Content-Type标头。你可以从PHP强制它:

    header('Content-Type: text/html; charset=utf-8');
    

答案 1 :(得分:1)

第一个结果是Unicode字符集

mb_convert_encoding($unicode_content, 'UTF-8', 'HTML-ENTITIES');

http://phpfiddle.org/main/code/xkj-nyr

<?php
//UNICODE
$a = rawurldecode("%26%233221%3B%26%233240%3B%26%233277%3B%26%233240%3B%26%233233%3B");

//UTF-8
$b = rawurldecode("%E0%B2%95%E0%B2%A8%E0%B3%8D%E0%B2%A8%E0%B2%A1");

//Convert to utf-8
echo mb_convert_encoding($a, 'UTF-8', 'HTML-ENTITIES');
echo "\r\n";
echo $b;