不知道大家是否在Linux下见过这种现像,下载链接正常显示中文,鼠标移上去时,状态栏也是显示中文,当你点击链接开始下载,弹出的保存对话框却是乱码!而Windows下的Firefox却没有这个问题。这个情况不多见,偶然出现几次,手动改回来就是。

问题

不过有种情况,却是100%的,烦得我要去好好研究一下,那就是windows的http共享软件hfs的页面。不信看看,下载链接是中文,状态栏显示也是中文

hfs-chinese-link

当点击下载出现对话框时,居然是乱码,而用windows的Firefox却没有这个问题。

firefox-chinese-filename-confusion

难道是Firefox的问题吗?不是,用另一个浏览器Epiphany测试也是这样的。那么证明应该不是Firefox的问题,而是浏览器跟操作系统交流时出了点问题。

解决方法一

如果强制在Firefox指定页面编码,设成GBK(包括兼容的GB2312,GB18030,下同),页面本来的中文却变成乱码,这时候点击下载,却变回正常文件名了,抓狂吧,看来就是编码原因。

在hfs里编辑html模板,把“header”里的“meta”标记的属性“charset”值“UTF-8”改为“GBK”,刷新重试,页面正常显示,下载保存时文件名也没问题了,问题似乎就这么解决了。

hfs-html-template

解决方法二

上面那个方法要在服务端设置,那是自己建的hfs服务,但是不能指望别的网站也设成GBK呀,很多外国网都用UTF-8的。所以还得研究一下如何在客户端这边搞定。

本来想写一下分析过程,问题原理,涉及到url编码问题,测试了几种情况搞得我自己也挺糊涂,还是直接跳过吧。

hfs可以对非ascii字符进行编码,比如“中文”url编码后就变成“%E4%B8%AD%E6%96%87”。不过都不影响问题。反正大概就是当Firefox把这个字符串调用操作系统的图形组件时(如保存文件对话框),编码解析不一致导致乱码(我也奇怪,明明都是UTF-8)。

windows默认使用ANSI编码(中文就是GBK啦),那么用Linux的环境设置成GBK怎么样呢?当然设置全局都是GBK编码时不好的,不要忘记Linux有env命令可以针对单个程序设置环境变量的,这么启动Firefox

env LANG=zh_CN.GBK firefox

结果问题就解决,Epiphany同样用这个方法解决,浏览几个页面,没有出现不正常的情况。

恼人的编码

不特不说中文乱码问题真的很讨厌,搞Java EE时的jsp、struts、tomcat等等各种配置的编码就弄得人死去活来。单说简单的html,“meta”标记里面有个charset属性,http请求头里面也有个“Accept-Charset”键,url编码非ascii字符也有一个编码,浏览器里面也可以指定页面编码,保存html的文本文件也有个编码,真他娘的折腾。