如何使用PHP读取一个Unicode URL?

3

我是一位有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我有一个Unicode URL:\test.php?sText=Московский

我想使用$_Get函数来处理sText的值。我现在的test.php代码如下:

<?php
$sVar = $_GET['sText'];

echo "Variable = $sVar";
?>

问题在于上面的内容会返回为:变量 = ??????????

我需要做什么?
5个回答

2

这对我来说很好用:

$sVar = $_GET['sText'];

echo urldecode($sVar);

1

感谢所有的反馈。

我已经尝试了所有的例子,但是即使保存为utf-8后仍然返回问号。

是否有php.ini设置需要添加/启用以支持Unicode?

目前,对于我来说,以下代码:

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<?php
$sVarControl = "Московский";
$sVar = $_GET['sText'];

echo "Control = $sVarControl <br />";
echo "Variable = $sVar <br />";

?>
</body>
</html>

生成以下输出:

控制 = Московский
变量 = ??????????

因此,该页面能够处理和显示Unicode。这可能是$_GET函数的限制吗?


编辑

我刚刚尝试在Google Chrome中运行该页面,它完美地工作了。这让我想到可能是IE的设置问题。但是是什么问题呢?我该如何解决它?


1

我终于解决了这个问题,感谢大家提供的一些好建议(请参见本帖子最后一段的快速答案)。

我做了一些错误的事情,使事情变得困难。

当记录没有写入我的数据库时,我首先注意到我的编码问题,数据库和表都设置为utf-8,所以只能是php的问题。

为了简化事情,我创建了一个测试php页面来演示问题。由于该页面从url获取($_GET)值,因此当我加载我的测试页面时,我使用了一个unicode参数在url test.php?sText=Московский

对我来说,问题可能是IE如何相互操作url,由于某种原因它无法解码或识别它为unicode。当我在Chrome中启动失败的页面时,它完美地工作了,这一点变得明显。

我继续使用以下函数在Chrome和IE中输出完整的url

<?php
function curPageURL() {
 $pageURL = 'http';
 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
 $pageURL .= "://";
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
 }
 return $pageURL;
}

echo curPageURL();
?>

Internet Explorer 8 显示了以下内容:

http://localhost/FirstProject/test.php?sText=??????????

然而,Chrome回显了一个编码后的URL:

http://localhost/FirstProject/test.php?sText=%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9

正如您所看到的,Chrome自动对URL进行编码,而PHP自动正确地读取和解码它,这可能是因为我已将内容类型设置为UTF-8(感谢Philippe)。

我仍然不确定IE为什么会表现出这样的行为,但它让我尝试在调用页面中对URL进行编码。我在JavaScript中调用了该页面,因此我尝试了encodeURIComponent()函数。幸运的是,这起作用了,现在我在Chrome和IE中得到了相同的结果。

长话短说,如果我使用encodeURIComponent()来编码调用URL,并确保我将目标PHP页面的内容类型设置为header('content-type: text/html; charset=utf-8');,则所有Unicode URL变量都将被正确处理。

再次感谢您的帮助。 Craig


1
  • 你需要在 test.php 文件中返回一个 UTF-8 的 content-type 头信息:header('content-type: text/html; charset=utf-8');
  • 你需要将 test.php 文件保存为 UTF-8 编码(虽然不确定,但这样做也无妨)

谢谢Philippe,我稍后会试一下。 - SausageFingers
1
他在处理GET请求编码时遇到了问题。第一个提示只会更改响应编码。第二个提示只会更改源代码编码。 - BalusC
你想怎么知道呢?如果响应编码错误,他无法通过响应来检查请求编码... - Philippe Gerber

0

我已经尝试使用iconv()函数来解决您的问题(函数参数可能因系统配置而异):

$get = iconv('CP1251', 'UTF-8', $_GET['text']);
echo 'Variable = '.$get; // Variable = Московский

你可以阅读关于iconv函数的内容。希望对你有所帮助。

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