【已解决】wordpress中,url地址包含的中文,虽然已经过urllib.quote解析过了,但是却还是访问出错:403 Forbidden
【背景】
在wordpress中,有个网页,其中包含了一张图片,但是无法显示。
去看了html源码发现,此处的图片地址是:
其中“资料收集”4个中文字符所对应解析过的,url地址所允许的字符是:’%D7%CA%C1%CF%CA%D5%BC%AF’
但是,而且对应的位置中,也的确包含对应的图片的,结果却显示403 Forbidden错误,无法显示。
对应的截图是:



【解决过程】
1.去Python中测试了一下,才发现,”资料整理”这四个中文字符,经过不同编码,的确对应着不同的结果,分别是:
>>> urllib.quote(‘资料收集’) ==
‘%D7%CA%C1%CF%CA%D5%BC%AF’
>>> urllib.quote(u’资料收集’.encode(“utf-8”))
‘%C3%97%C3%8A%C3%81%C3%8F%C3%8A%C3%95%C2%BC%C2%AF’
然后,又去wordpress中,手动一点点找到了对应的url中的所有的内容:
可以看出,其中url链接中的地址所包含的“资料整理”的对应的解析过的字符,是utf-8的,而不是上面的gb2312/GBK的,所以才会找不到图片,而上面的utf-8的地址中,是可以找到并显示图片的。
这下就明白了,看来wordpress中,应该是只支持utf-8解析出来的链接的。
2.以为上述理解是对的,后来一想,好像也不对。
因为上面的地址:
中的%D7%CA%C1%CF%CA%D5%BC%AF,我可是手动创建的一个文件夹,文件夹名字就是%D7%CA%C1%CF%CA%D5%BC%AF,而不是用的中文名“资料整理”来创建的文件夹,所以,上述%D7%CA%C1%CF%CA%D5%BC%AF,只是对应的英文字符而已,不应该被wordpress自动解析成中文“资料整理”,然后再用其utf-8编码去翻译为:’%C3%97%C3%8A%C3%81%C3%8F%C3%8A%C3%95%C2%BC%C2%AF’,如果真的是这样,那也就太变态了吧。。。
3.又想起来了,之前是刚刚手动删除了之前创建的“资料整理”的中文文件夹,而手动拷贝(创建)了“%D7%CA%C1%CF%CA%D5%BC%AF”文件夹及其下所有的图片,但是此过程之后,却没有重启apache服务,估计是apache服务没有更新的原因而导致文件夹没法访问的。所以,去重启试试。
4.重启apache,重新登录账户之后,wordpress中,还是该网页中的图片还是无法显示。
而且才注意到,原来开始的时候,网页中显示的就是%D7%CA%C1%CF%CA%D5%BC%AF,但是地址却是’%C3%97%C3%8A%C3%81%C3%8F%C3%8A%C3%95%C2%BC%C2%AF’,见图:

真是悲催了。还是没搞定。
5.刚重新在wordpresswp-contentuploads下面手动建立了一个文件夹“%D7”,然后立刻就可以在网页中:
http://localhost/wordpress/wp-content/uploads/
看到了“%D7”,但是,却是地址却是http://localhost/wordpress/wp-content/uploads/%25D7/
即,自动针对%D7的地址生成了%25D7,好像是如果发现文件夹(包含文件名?)中包含有非utf-8编码的值,因为这里的%D7属于gb2312的编码,然后其就会自动帮你转化为对应utf-8编码的值?
刚刚才发现根本原因,其实很简单,就是百分号字符’%’,对应的ascii值是37=0x25,而不论是gb2312还是utf-8,也都是同样的编码值。
然后此处的文件夹名称%D7 = 字符百分号 + 字母D +数字7 = utf-8编码的%25 + 字母D + 数字7 = %25D7,如此而已。
即,对于你建立一个文件夹叫做%D7的话,那么无论wordpress中用的是utf-8还是GB2312(/GBK/GB18030),也都会编码为%25D7的。
6.刚去试了下,手动在wordpresswp-contentuploads下面手动建立了一个文件夹“资料收集”,然后生成网页中:
http://localhost/wordpress/wp-content/uploads/
显示的是对应的中文:
“资料收集”
对应的地址是:
http://localhost/wordpress/wp-content/uploads/%e8%b5%84%e6%96%99%e6%94%b6%e9%9b%86/
说明,对应的资料收集的utf-8编码,是%e8%b5%84%e6%96%99%e6%94%b6%e9%9b%86。
7. 关于wordpress中的编码,是可以自己设置的,为了兼容中文字符,还是utf-8较好。
8.想要解决此处的不能显示的问题,就明白如何做了,那就是在对于网页的源码中,对于资源路径中的百分号%,要转化为对应的%25即可。
【总结】
上面的%D7%CA%C1%CF%CA%D5%BC%AF,是一个百度空间里面所用的地址中的字符,是百度用的GB2312去编码“资料收集”四个中文字符,然后被quote解析出来的,而网页中的图片链接地址,就是为了防止图片不能显示,所以才替换为%D7%CA%C1%CF%CA%D5%BC%AF的,结果没想到,还是遇到了编码的问题,导致图片不能显示,看来,还是需要再去处理一下,把%换位%25,图片才能显示啊。
悲催的编码。。。
转载请注明:在路上 » 【已解决】wordpress中,url地址包含的中文,虽然已经过urllib.quote解析过了,但是却还是访问出错:403 Forbidden