如何在PHP中将utf8编码为像浏览器一样的url?

时间:2013-03-15 07:58:27

标签: php utf-8 urlencode

将此网址输入浏览器时:http://www.google.com/?q=ä

发送的网址实际上是http://www.google.com/?q=%C3%A4

我想使用Php进行相同的转换 - 如何做到这一点?

我尝试了什么:

$url = 'http://www.google.com/?q=ä'; //utf8 encoded

echo rawurlencode($url);
//gives http%3A%2F%2Fwww.google.com%2F%3Fq%3D%C3%A4

$u = parse_url($url);
echo $url['scheme'].'://'.$url['host'].$url['path'].'?'.rawurlencode($url['query']);
//gives http://www.google.com/?q%3D%C3%A4

上面的网址只是一个简单的例子,我需要一个也适用于

的通用解决方案
http://www.example.com/ä
http://www.example.com/ä?foo=ä&bar=ö
http://www.example.com/Περιβάλλον?abc=Περιβάλλον

这里提供的答案不够通用: How to encode URL using php like browsers do

2 个答案:

答案 0 :(得分:7)

好的,花了我一些时间,但我认为我有通用的解决方案:

function safe_urlencode($txt){
  // Skip all URL reserved characters plus dot, dash, underscore and tilde..
  $result = preg_replace_callback("/[^-\._~:\/\?#\\[\\]@!\$&'\(\)\*\+,;=]+/",
    function ($match) {
      // ..and encode the rest!  
      return rawurlencode($match[0]);
    }, $txt);
  return ($result);
}

基本上它使用 URL保留字符http://www.ietf.org/rfc/rfc3986.txt)+ 更多字符来拆分字符串(因为我认为“点”也应该单独使用并且其余的 rawurlencode()

echo safe_urlencode("http://www.google.com/?q=ä");
// http://www.google.com/?q=%C3%A4

echo safe_urlencode("http://www.example.com/Περιβάλλον?abc=Περιβάλλον");
// http://www.example.com/%CE%A0%CE%B5%CF%81%CE%B9%CE%B2%CE%AC%CE%BB%CE%BB%CE%BF%CE%BD?abc=%CE%A0%CE%B5%CF%81%CE%B9%CE%B2%CE%AC%CE%BB%CE%BB%CE%BF%CE%BD
// ^ This is some funky stuff, but it should be right

答案 1 :(得分:-1)

看起来你想要编码URI的query部分而不需要修改模式和主机。

<强>序言

语言没有提供通用功能来实现这一功能,因为语言无法知道您是否将编码字符串用于redirectquery argument(?url = http %3A%3A ....)

所以开发人员必须像你一样提取要编码的部分。

<强>答案

将您自己的代码封装为函数。

function encodeUrlQuery($url) {
  $u = parse_url($url);
  return $u['scheme'].'://'.$u['host'].$u['path'].'?'.rawurlencode($u['query']);
}

echo encodeUrl('http://www.google.com/?q=ä');