我需要获取一些包含瑞典字母表中某些字符的URL。
如果您将此类字符串作为https://en.wikipedia.org/wiki/Åland_Islands
的示例,将其作为参数直接传递到file_get_contents
调用就可以了。但是,如果您首先通过urlencode
运行该URL,则调用将失败,并显示以下消息:
无法打开流:没有此类文件或目录
尽管有file_get_contents
的文档说:
注意:如果要打开带有特殊字符的URI,例如空格, 你需要用urlencode()编码URI。
例如,如果您运行以下代码:
error_reporting(E_ALL);
ini_set("display_errors", true);
$url = urlencode("https://en.wikipedia.org/wiki/Åland_Islands");
$response = file_get_contents($url);
if($response === false) {
die('file get contents has failed');
}
echo $response;
您将收到错误消息。如果您只是从代码中删除“urlencode”,它将运行正常。
我面临的问题是我的网址中有一个参数来自提交的表单。由于PHP始终通过urlencode
运行提交的值,因此构造的URL中的瑞典字符将导致错误发生。
我如何解决这个问题?
答案 0 :(得分:4)
问题可能是由于urlencode逃避了你的协议:
https://en.wikipedia.org/wiki/Åland_Islands
https%3A%2F%2Fen.wikipedia.org%2Fwiki%2F%C3%85land_Islands
这是我也遇到过的一个问题,只能通过尝试将转义目标定位到逃生所需的内容来解决:
https://en.wikipedia.org/wiki/Åland_Islands
https://en.wikipedia.org/wiki/%C3%85land_Islands
根据角色所在的位置,可以想象这很棘手。我通常选择编码补丁解决方案,但我曾与之合作的人更喜欢只对其网址的动态段进行编码。
这是我的方法:
https://en.wikipedia.org/wiki/Åland_Islands
https%3A%2F%2Fen.wikipedia.org%2Fwiki%2F%C3%85land_Islands
https://en.wikipedia.org/wiki/%C3%85land_Islands
代码:
$url = 'https://en.wikipedia.org/wiki/Åland_Islands';
$encodedUrl = urlencode($url);
$fixedEncodedUrl = str_replace(['%2F', '%3A'], ['/', ':'], $encodedUrl);
希望它有所帮助。
答案 1 :(得分:0)
使用此
$usableURL = mb_convert_encoding($url,'HTML-ENTITIES');