在专用服务器上:
$_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>
答案 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');
...打印:
ಕನ್ನಡ
ಕನ್ನಡ
你的两个字符串完全不同,即使在HTML上下文中呈现它们看起来也是一样。
编辑#1:实际上可以在POST变量中获取HTML实体,但这是一个浏览器功能:如果用户键入HTML表单中文档编码不支持的某些字符,浏览器更喜欢生成HTML实体,而不是发送或删除不支持的字符。但是你需要一个浏览器;如果从PHP手动填充$_POST
,则不会发生这种情况。
编辑#2:正如我怀疑的那样,您发布的代码不是实际代码。您的输入字符串不一样,但您没有注意到,因为您正在将表单数据操作为HTML:
echo $_POST['kannada']."<br/>";
...因此您的HTML实体被呈现作为HTML。你需要这样做:
echo htmlspecialchars($_POST['kannada'])."<br/>";
其余的就是我已经说过的。您的页面未被解释为UTF-8。确保:
网络服务器正在发送正确的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;