将此网址输入浏览器时: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
答案 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
部分而不需要修改模式和主机。
<强>序言强>
语言没有提供通用功能来实现这一功能,因为语言无法知道您是否将编码字符串用于redirect
或query 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=ä');