本文关键字:

首先说明的是,本文不是什么让 把页面解析成中文的问题,而是 URL 中包含中文目录或者中文文件名无法访问的问题。

例如 http://littlepig.cn/最新上传/孤单的想念.mp3

如果以 做 Web Server ,上面这个 URL 是没有办法访问的,曾经为这个问题烦恼了很长时间,查阅了无数资料,苦无良策,因为我的歌曲网站以前是 Debian ,全是以歌手名和专辑名字来分类的,用 http 在线听歌肯定要涉及到中文目录,又不想用低效率、关键是无法控制多线程和带宽的 IIS,于是跑到相似的 music.zixia.net 上 mail 人家管理员,得到的说法是要找一个 n 年前的什么 mod 才可以,而且只能是 1.x 版本才能用的,于是放弃。

前些日子主板坏掉,不得已把硬盘挂载在了 Windows 2000 Server 上,懒得在 IIS 上加 php 解析- (我网站的页面是 php 的),就顺手又装了个集成的 AppServer ,用其中的 + php 来列表歌曲目录,用 2000 自带的 IIS 辅助做 http 播放,也总算没白瞎了那 80G 歌曲。在测试过程中顺手用 Maxthon 顺手敲了 的歌曲链接,不想竟然弹出来了下载对话框,惊诧不已。

用上例中的链接在 TTPlayer 中播放,全无效果,说明 根本不理,但同样链接 Maxthon 说可以下载,那么肯定问题就出现在 Get 该文件过程中了,TTPlayer 和 Maxthon 都用 http Get 同一个文件有啥不同呢,用 WSockExpert 抓了一下包

TTPlayer :
    Get /最新上传/孤单的想念.mp3
Maxton:
    Get /%E6%9C%80%E6%96%B0%E4%B8%8A%E4%BC%A0/%E5%AD%A4%E5%8D%95%E7%9A%84%E6%83%B3%E5%BF%B5.mp3

想必这肯定是 URLEncode 之后的结果了,于是赶紧测试啥函数能输出这样的结果
<?php
$s=”/最新上传/孤单的想念.mp3″;
echo “原中文:”.$s;
echo “<br/>”;
echo “Maxthon输出:”.”/%E6%9C%80%E6%96%B0%E4%B8%8A%E4%BC%A0/%E5%AD%A4%E5%8D%95%E7%9A%84%E6%83%B3%E5%BF%B5.mp3″;
echo “<br/>”;
echo “URLEncode输出:”.urlencode($s);
echo “<br/>”;
echo “RAWEncode输出:”.rawurlencode($s);
echo “<br/>”;
?>

结果未能如愿:

原中文:/最新上传/孤单的想念.mp3
Maxthon输出:/%E6%9C%80%E6%96%B0%E4%B8%8A%E4%BC%A0/%E5%AD%A4%E5%8D%95%E7%9A%84%E6%83%B3%E5%BF%B5.mp3
URLEncode输出:%2F%D7%EE%D0%C2%C9%CF%B4%AB%2F%B9%C2%B5%A5%B5%C4%CF%EB%C4%EE.mp3
RAWEncode输出:%2F%D7%EE%D0%C2%C9%CF%B4%AB%2F%B9%C2%B5%A5%B5%C4%CF%EB%C4%EE.mp3

显然一个不同之处就在于 Maxthon 是一个汉字输出成三个%编码,而 urlencode 是两个,仍不死心,想到 IE 高级选项里有个 始终以 UTF-8 发送 选项,我的歌曲页面是 GB2312 编码,是不是和这有关呢,暂且胡乱一试,前搜后索,找到个 mb_convert_encoding

echo “GB2312->UTF8然后URLEncode的结果:”.urlencode(mb_convert_encoding($s,”utf-8″,”gb2312″))

输出为:

GB2312->UTF8然后URLEncode的结果:%2F%E6%9C%80%E6%96%B0%E4%B8%8A%E4%BC%A0%2F%E5%AD%A4%E5%8D%95%E7%9A%84%E6%83%B3%E5%BF%B5.mp3

乍一看好像也不对,不过仔细研读,好熟悉啊,不同之处就在于 / 被编码成了 %2F,真是得来全不费功夫,替换一把不就可以了吗。

echo ereg_replace(“%2F”,”/”,urlencode(mb_convert_encoding($s,”utf-8″,”gb2312″)));

输出:

/%E6%9C%80%E6%96%B0%E4%B8%8A%E4%BC%A0/%E5%AD%A4%E5%8D%95%E7%9A%84%E6%83%B3%E5%BF%B5.mp3

大功告成,赶紧把 IIS 停掉,用 听歌,果真可以,欣喜。

听歌过程中又发现个问题,空格 会被编码为 + ,这个 easy ,再 replace 一把。

下面是个完整的函数,只要把你的中文路径及文件输出用 encode 函数编码一把,客户端访问就没有问题了。

function encode($s)
{
    $s=ereg_replace(“%2F”,”/”,urlencode(mb_convert_encoding($s,”utf-8″,”gb2312″)));
    return ereg_replace(“+”,” “,$s);
}

比如 你的链接是: http://littlepig.cn/最新上传/孤单的想念.mp3
现在可以在 php 中写成: “http://littlepig.cn”.encode(“/最新上传/孤单的想念.mp3″)
输出会是:http://littlepig.cn/%E6%9C%80%E6%96%B0%E4%B8%8A%E4%BC%A0/%E5%AD%A4%E5%8D%95%E7%9A%84%E6%83%B3%E5%BF%B5.mp3

虽然看起来乱七八糟,但至少可以访问了哈~~~~~

以上只在 Windows 2000 Server + 2 + PHP 上测试通过,其他的暂无条件测试。。

    相关信息


相关日志