file_get_contents - URL中的特殊字符 - 特殊情况

时间:2015-07-30 09:48:49

标签: php utf-8 character-encoding file-get-contents

我没有让file_get_contents()在这个特殊情况下返回页面,其中url包含'Ö'字符。

$url = "https://se.timeedit.net/web/liu/db1/schema/s/s.html?tab=3&object=CM_949A11_1534_1603_DAG_DST_50_ÖVRIGT_1_1&type=subgroup&startdate=20150101&enddate=20300501"
print file_get_contents($url);

如何使file_get_contents()在此网址上按预期工作?

我尝试过以下解决方案,但没有达到工作结果:

1

print rawurlencode(utf8_encode($url));

2

print mb_convert_encoding($url, 'HTML-ENTITIES', "UTF-8");

3

$url = urlencode($url);
print file_get_contents($url);

4

$content = file_get_contents($url);
print mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));

在这些问题中找到:

file_get_contents - special characters in URL

PHP get url with special characters without urlencode:ing them!

file_get_contents() Breaks Up UTF-8 Characters

更新: 正如您所看到的,我的示例中实际返回了一个页面,但它不是预期的页面,是您在浏览器中键入URL时获得的页面。

2 个答案:

答案 0 :(得分:2)

网址不能包含“Ö”!从这个基本前提出发。任何不在ASCII定义的子集中的字符必须经过URL编码才能在URL中表示。正确的方法是urlencoderawurlencode(取决于服务器期望的格式)网址的各个细分,不是整个网址。< / p>

E.g:

$url = sprintf('https://se.timeedit.net/web/liu/db1/schema/s/s.html?tab=3&object=%s&type=subgroup&startdate=20150101&enddate=20300501',
               rawurlencode('CM_949A11_1534_1603_DAG_DST_50_ÖVRIGT_1_1'));

您仍然需要为字符串使用正确的编码! ISO-8859-1中的Ö将被编码为%D6,而在UTF-8中,它将被编码为%C3%96。哪一个是正确的取决于服务器期望的。

答案 1 :(得分:1)

需要对unicode字符进行百分比编码。这是我所知道的一种方式。

$url2 = "https://se.timeedit.net/web/liu/db1/schema/s/s.html?tab=3&object=" . urlencode('CM_949A11_1534_1603_DAG_DST_50_ÖVRIGT_1_1') . "&type=subgroup&startdate=20150101&enddate=20300501";
echo "encoded: " . $url2;
print file_get_contents($url2);