1

在专用服务器上:

$_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>
4

2 回答 2

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 实体而不是发送或删除不支持的字符。但是你需要一个浏览器吗?$_POST如果您从 PHP 手动填写,则不会发生。


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

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

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

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

剩下的就是我已经说过的了。您的页面没有被解释为 UTF-8。确保:

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

    header('Content-Type: text/html; charset=utf-8');
    
于 2014-01-23T11:57:35.693 回答
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;
于 2014-01-23T12:15:44.847 回答