将unicode URL转换为ASCII

时间:2015-06-14 14:29:55

标签: php unicode encoding ascii

我正在编写一个接受用户URL的PHP​​应用程序,然后通过调用带有system() *的二进制文件来处理它。但是,为了避免因此而产生的许多复杂情况,我试图将包含Unicode字符的URL转换为ASCII字符。

我们说我有以下网址:

https://täst.de:8118/news/zh-cn/新闻动态/2015/

这里需要处理两个部分:主机名和路径。

  • 对于主机名,我只需拨打idn_to_ascii()
  • 即可
  • 但是,我不能简单地在路径上调用urlencode(),因为每个需要保持未修改的字符也会被转换(例如news/zh-cn/新闻动态/2015/ -> news%2Fzh-cn%2F%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81%2F2015%2F而不是news/zh-cn/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/2015/ })。

我该如何解决这个问题?

*我宁愿不处理system()调用以及由此产生的复杂性,但鉴于该功能只能通过调用二进制文件来实现,我很遗憾别无选择。 < / p>

3 个答案:

答案 0 :(得分:1)

/拆分网址,然后urlencode()将该部分重新组合在一起

$url = explode("/", $url);
$url[2] = idn_to_ascii($url[2]);
$url[5] = urlencode($url[5]);
$url = join("/", $url);

答案 1 :(得分:0)

您可以使用PHP的iconv函数:

inconv("UTF-8", "ASCII//TRANSLIT", $url);

答案 2 :(得分:0)

以下内容可用于此转换:

function convertpath ($path) {
  $path1 = '';
  $len = strlen ($path);
  for ($i = 0; $i < $len; $i++) {
     if (preg_match ('/^[A-Za-z0-9\/?=+%_.~-]$/', $path[$i])) {
       $path1 .= $path[$i];
     }
     else {
       $path1 .= urlencode ($path[$i]);
     }
  }
  return $path1;
}