PHP URL编码问题

3

我有一些URL,我相信它们是CP-1251编码的。例如:

http://domain.com/Test - суть в этом.mp3

mb_detect_encoding 表明这是 ASCII 编码。但是,我尝试将其转换为 UTF-8,但没有成功。不过下面的方法可以解决问题:

$url = mb_convert_encoding(urldecode($url), "Windows-1251", "auto");

这意味着它将url转换为Windows-1251编码。虽然这很奇怪,但它可以正确显示字符。但是当我将这个转换后的url插入到一个html对象中(如一些音乐播放器)时,它不起作用。Firebug显示错误:
"NetworkError: 404 Not Found - http://domain.com/Test%20-%20????%20?%20????.mp3"

某种方式,我得到了问号而不是正确的url。使用urlencode没有帮助。

文件本身是utf-8编码。

我对所有这些东西感到困惑。这里是否有任何解决方案?


你尝试过使用 utf8_encode($url) 吗?如果你的页面编码设置为 utf-8,这应该可以解决问题。 - Michael Mior
@Michel Mior - 是的,我有看到。它给了我以下结果:http://domain.com/Test - СÐСÑСâСРРРСÐСâÐ ÑÐ Ñ.mp3,这当然不好。 - grjj3
当你说“文件本身是utf-8”时,你是指HTML页面吗? - Michael Mior
1
是的。现在不重要了,问题已经解决了。感谢这里所有人的回复。 - grjj3
1
你可以将你的解决方案发布为答案,以便未来读者参考吗? - Michael Mior
很不幸,我无法将其作为答案发布。Stackoverflow对于发布自己问题的答案有限制。但我已经在问题之后发布了答案。 - grjj3
2个回答

1

不太确定您要找什么答案,但它的原始编码是Windows-1251,您可以使用iconv进行检查:

var_dump(detect_encoding($url);

function detect_encoding($string) { 
  static $list = array('utf-8', 'windows-1251');

  foreach ($list as $item) {
    $sample = iconv($item, $item, $string);
    if (md5($sample) == md5($string))
      return $item;
  }
  return null;
}

这个网站也非常有帮助:通用西里尔解码器


1

已解决。

只需要单独取文件名并 rawurlencode 它。


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