将 unicode URL 转换为 ASCII
Convert unicode URL to ASCII
我正在编写一个 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%2F
而不是 news/zh-cn/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/2015/
).
我该如何解决这个问题?
*我宁愿不处理 system()
调用和由此产生的复杂性,但考虑到该功能只能通过调用二进制文件使用,很遗憾,我别无选择。
将 URL 拆分为 /
然后 urlencode()
然后将其重新组合在一起[=13=]
$url = explode("/", $url);
$url[2] = idn_to_ascii($url[2]);
$url[5] = urlencode($url[5]);
$url = join("/", $url);
您可以使用 PHP 的 iconv 函数:
inconv("UTF-8", "ASCII//TRANSLIT", $url);
以下内容可用于此转换:
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;
}
我正在编写一个 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%2F
而不是news/zh-cn/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/2015/
).
我该如何解决这个问题?
*我宁愿不处理 system()
调用和由此产生的复杂性,但考虑到该功能只能通过调用二进制文件使用,很遗憾,我别无选择。
将 URL 拆分为 /
然后 urlencode()
然后将其重新组合在一起[=13=]
$url = explode("/", $url);
$url[2] = idn_to_ascii($url[2]);
$url[5] = urlencode($url[5]);
$url = join("/", $url);
您可以使用 PHP 的 iconv 函数:
inconv("UTF-8", "ASCII//TRANSLIT", $url);
以下内容可用于此转换:
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;
}