rawurldecode和浏览器地址栏问题的utf-8问题

时间:2011-08-26 10:53:37

标签: php utf-8 urldecode

我在使用土耳其字符集的rawurldecode时遇到了一些问题。

我有一个土耳其语(yeşil表示绿色),需要作为GET参数传递。

这是我生成的链接。

search.php?renk=ye%C5%9Fil

当我点击此链接时,浏览器地址栏就会显示出来。 (它被正确解码)

search.php?renk=yeşil

问题从这里开始。当我在浏览器地址栏中修改url时(比如添加额外的get参数)并按Enter键修改关键字并生成如下所示的URL。

search.php?renk=ye%FEil

此点之后服务器端代码不处理参数并生成错误结果。有没有标准的方法来避免这种情况?

感谢。

2 个答案:

答案 0 :(得分:4)

看起来您的浏览器会将链接转换为iso-8859-9编码或类似内容。 %FE是来自iso-8859-9编码的urlencoded。

我已经尝试了iconv("iso8859-9", "utf-8", rawurldecode("search.php?renk=ye%FEil"))并且有效。

答案 1 :(得分:0)

网址总是使用US-Ascii!

请参阅RFC:http://www.ietf.org/rfc/rfc1738.txt

  

没有相应的图形US-ASCII:

     

只能使用图形的可打印字符编写URL   US-ASCII编码字符集。八位字节80-FF十六进制不是
  在US-ASCII中使用,八位字节00-1F和7F十六进制表示
  控制字符;这些必须编码。

现在你遇到了很多问题。 如果将URL粘贴到浏览器中,则url字段有时会依赖于OS区域设置。 浏览器可以转换它。 有时防火墙和代理可以过滤网址!

下一个重要问题是: Web服务器如何解释这些高字符。 它是如何将它转移到PHP(取决于网关)。 php自动解码网址,你会在那里发生什么事情? php不关心编码。

在我看来,这只是一个可以解决的解决方案。 将unicodestring编码为base64encoded字符串。 这将保存在网址中 - 因为它是ascii。

在您的脚本中,您可以对其进行解码,然后将其恢复为您之前设置的编码。