将Unicode URL转换为ASCII

3

我正在编写一个 PHP 应用程序,它接受用户提供的 URL,然后通过使用 system()* 调用某些二进制文件进行处理。但是,为避免由此引起的许多复杂性,我试图将可能包含 Unicode 字符的 URL 转换为 ASCII 字符。

假设我有以下 URL:

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%2Fnews/zh-cn/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/2015/)。

我应该如何解决这个问题?


*我宁愿不涉及system()调用和由此产生的复杂性,但考虑到只能通过调用二进制文件来使用功能,我不幸没有选择。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Lance
3个回答

1

将URL按/拆分,然后对该部分进行urlencode()编码,最后重新组合在一起。

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

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;
}

0
你可以使用PHP的iconv函数:
inconv("UTF-8", "ASCII//TRANSLIT", $url);

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