解决wget下载文件名乱码的一些方法
在下载用apache或者nginx做的索引目录时,遇到文件名乱码问题。搜索了不少资料,尝试了好几种方案,大家可以结合使用。
一般情况下加上–restrict-file-names=nocontrol参数就可以用了。
其实除了下面方法一和方法二外,还有一个大家可以自由发挥的,我是没有研究透,编码实在太让自己头疼了。
有一个前提,要注意索引目录显示出来的是什么编码,比如有些网站是UTF-8(这个应该比较正规,中文不会出现很大麻烦,可以用方法二搞定),有些是GBK,可能跟文件的编码,或者apache、nginx的设置有关吧。
1、下载的时候保存成ascii,跟方法三类似
|
|
2、用一个重命名软件,菲菲更名宝贝RenamePro8.0,相当好用。在“高级文件名变”更里面有一个“文件名编码与解码”,“ANSI编码URL字符串转换为文字”,大家可以多试试。
下载: RenamePro8.zip
3、如果不行,可以研究一下wget的一些参数,相关的有两个。
–local-encoding=ENC IRI (国际化资源标识符) 使用 ENC 作为本地编码。
–remote-encoding=ENC 使用 ENC 作为默认远程编码。
方法一
moper:这种方法是把文件名转换成ascii,加了一个–restrict-file-name=ascii参数,然后再用python写的一段程序,转换成win能够接受的编码。其实我们只需加另一个参数–restrict-file-names=nocontrol,就可以了。
完整命令为
|
|
(我解释的不专业请看正文,发觉编码好混乱哎)
《使用 wget 整站下载》
转自http://blog.csdn.net/kowity/article/details/6899256
最近发现一个很好的网站:http://ebook.elain.org,里面有大量的技术书籍。于是想使用 wget 把整个网站都下载下来。但是 wget 对中文的 url 支持得不够好,直接使用:
|
|
下载的话,中文文件名就会乱码,比如“2010架构师大会PPT”就变成了“2010鏋舵瀯甯堝ぇ浼歅PT”。
|
|
下载的话,中文文件名会编码成URL形式,比如比如“2010架构师大会PPT”就变成了“2010%E6%9E%B6%E6%9E%84%E5%B8%88%E5%A4%A7%E4%BC%9APPT”。主要是因为在网页上,中文 URL会以 UTF-8 来编码,而 Windows 存储文件名是用GBK编码。也就是说“2010鏋舵瀯甯堝ぇ浼歅PT”实际上是以 GBK 编码来显示的 UTF-8 编码的文件名。这样我们只要用 Python 写个编码转换器就可以了。代码如下:
|
|
如果 wget 是使用以下命令行来下载:
|
|
那么下载下来的文件是“2010%E6%9E%B6%E6%9E%84%E5%B8%88%E5%A4%A7%E4%BC%9APPT”形式,运行脚本时就使用以下命令:
|
|
方法二
改wget源代码
moper:不推荐这种方法,因为比较麻烦,我也没有测试,可能这种效果会好一些吧。
文章一《wget中文乱码解决方案》
用wget下载网页时,若文件名含有非ASCII字符或其他特殊字符,就会出现所谓的乱码。若想解决中文乱码的问题,可以修改wget的源代码。
对URL字符串进行编码的源代码文件是url.c。其中,url_file_name()的功能是根据URL判断应该以什么文件名保存文件。而该函数又调用了append_uri_pathel(),该函数调用了FILE_CHAR_TEST()宏,它用于判断URL中的字符是不是特殊字符(也就是需要进行URL编码的字符。当然,包括中文)。问题就出在这个宏身上了。为了不对中文转义,需要将中文字符当作普通字符对待。将如下所示的FILE_CHAR_TEST()宏:
|
|
修改为:
|
|
文章二《解決wget中文亂碼問題的非完善方案》
1. 出現亂碼的原因
http請求的流程如下:
(1) 瀏覽器按URL編碼規則將URL(包括post或get提交的那一部分)字符串編碼之後發送給服務器;
(2) 服務器將所收到的字符串轉換為unicode編碼,處理完瀏覽器的請求後再把它發送給瀏覽器;
(3) 瀏覽器按指定的編碼顯示網頁。
在不同的字符編碼格式下,瀏覽器對包含諸如中文之類的非ACSII字符的URL字符串的解析結果是不一樣的。從而,URL編碼對象就不一樣了。wget下載網頁文件時,實質上是一個瀏覽器。它同樣會對所提交的URL字符串按URL編碼規則編碼。因此,所下載的文件的文件名就是經過編碼(先是按URL規則編碼,接著是unicode編碼,最後是unicode到瀏覽器端所設定的編碼)之後的字符串。如果瀏覽器端採用的是unicode編碼,則結果是一串由’%'、數字和字母組成的字符串;否則,將unicode編碼格式的URL字符串解析為瀏覽器端的編碼格式,這可能會產生非ACSII字符。我們所說的亂碼,包括這兩種情況。也就是說,跟原來的文件名不一樣,我們就管它出現亂碼。
2. 解決方案
由于上述原因,我們有必要修改wget的源代碼。對URL字符串進行編碼的源代碼文件是url.c。其中,url_file_name()的功能是根據URL判斷應該以什 文件名保存文件。而該函數又調用了append_uri_pathel(),該函數調用了FILE_CHAR_TEST()宏,它用于判斷URL中的字符是不是特殊字符(也就是需要進行URL編碼的字符。當然,包括中文)。問題就出在這個宏身上了。為了不對中文轉義,需要將中文字符當作普通字符對待。將如下所示的FILE_CHAR_TEST()宏:
|
|
修改為:
|
|
另外,如果使用unicode編碼方案的話,就不會出現上述第二種亂碼。因此,可以將瀏覽器端的字符編碼環境設置為unicode。這裡,選擇UTF-8編碼方案(UCS Transformation Format)。方法是在main.c的i18n_initialize最後加上:
|
|
。
這不是一個很好的解決方案。另外,它沒辦法解決其他語言的亂碼問題。當然,可以將url_file_name()中的URL編碼部份統統拿掉。這樣做的結果是,不出現亂碼,現時亦違背了URL編碼的初衷--安全。不過我還沒想到更簡單的方案。這是一種暫行方案。希望官方的解決方案的出現不會路漫漫其修遠兮。。。
wget 抓取中文乱码问题解决
wget国际化程度显然还不够(终于明白微软为什么有ANSI和UNICODE编码了),在下载过程中,如果遇到文件名中有中文的话,十有八九下载回来的文件会是一堆乱码。
google了一下,必须自己编译wget来解决这个中文乱码问题。
1、先从GNU网站上下载wget源码包。http://ftp.gnu.org/gnu/wget/ 我下载的是最新的wget-1.14.tar.gz
tar xzvf wget-1.14.tar.gz 解压
cd wget-1.14
修改src目录下的url.c文件:
第1300行
#define FILE_CHAR_TEST(c, mask) \
((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
(filechr_table[(unsigned char)(c)] & (mask)))
修改为:
#define FILE_CHAR_TEST(c, mask) \
(((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
(filechr_table[(unsigned char)(c)] & (mask))) \
&& !((c|0x0fffffff) == 0xffffffff)) /* 排除中文 */
第1416行
/* Walk the PATHEL string and check how many characters we'll need
to quote. */
for (p = b; p < e; p++)
if (FILE_CHAR_TEST (*p, mask))
++quoted;
修改为:
for (p = b; p < e; p++)
if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff))
++quoted;
2、安装GNUTLS
sudo install gnutls-bin
3、生成makefile
./configure --with-ssl=openssl
make
4、复制到目录
备份一下
sudo cp /usr/bin/wget /usr/bin/wget_backup
sudo cp ./src/wget /usr/bin/wget
解决wget下载文件名乱码的一些方法的更多相关文章
- 解决 Firefox 下载文件名乱码扩展 ReDisposition
作者 muzuiget 发布 2013-03-13 19:23 标签 redisposition Firefox 下载文件名乱码问题由来已久,偶然一两次还可以手动改名,批量下载时简直要亲命,最终我 ...
- 解决wget下载https时报错 --no-check-certificate (不检查证书)
如果使用 wget下载https开头的网址域名 时报错,你需要加上 --no-check-certificate (不检查证书)选项 例如: wget https://pypi.python.org/ ...
- 解决 linux 下面解压缩 中文文件名乱码问题的方法 unzip -O CP936
Linux 解压缩 zip包中文目录出现乱码的问题. 出现问题如图示: unzip -O CP936 xxx.zip 用这种方式处理一下就好了.
- 解决PHP在IE浏览器下载文件,中文文件名乱码问题
前提:我们网站所有文件全部使用的是UTF-8 NO BOM的编码方式 1.找测试重现.360浏览器下载的呵呵,果然文件名是乱码.再请测试在ie浏览器下测试.IE9,8,7也全部是乱码.查看编码就是UT ...
- 初学shell,今天遇到由wget下载到本地的网页源代码的乱码问题,无聊的写了一个转码的脚本
今天用wget想下载文件,结果下载了一堆本地的index.html文件,一查看全是乱码,然后百度了一下,网页的编码格式大概有三种: 1.utf-8 2.gb2312 3.gbk 要在网页源码中的< ...
- Microsoft Edge浏览器下载文件乱码修复方法(二)
之前有写过"Microsoft Edge浏览器下载文件乱码修复方法",发现很多情况下下载文件乱码问题还是存在,这里对之前内容做简单补充,希望可以帮到大家. 方法二: 默认如果提示下 ...
- C#中解决Response.AddHeader("Content-Disposition", "attachment; filename=" + filename)下载文件时文件名乱码的问题
问题:下载文件时文件名乱码怎么解决? 在C#写后台代码过程中,经常遇到下载文件出现文件名乱码的问题,在网上找了很多方法,总是存在浏览器不兼容的问题,当IE浏览器不乱码时,火狐浏览器就会乱码,后来经过反 ...
- 利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码
利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码 2014-07-31 12:53 1047人阅读 评论(0) 收藏 ...
- 解决Ubuntu 12.10中ZIP文件名乱码的方法
转摘源地址:http://blog.csdn.net/jiangxinyu/article/details/8206395 安装(12.04及以上): 代码: sudo apt-get install ...
随机推荐
- asp.net 项目发布注意点
在修改了某些代码后,要发布到服务器 这时候 ,在本地发布完把对应的文件复制到服务器上覆盖即可. 1.如果修改的是.cs .asmx等文件,则需要覆盖其对应项目名称的.dll文件 2.如果修改的是.h ...
- 消除textarea的空格de长度值
在项目中因为用到文本域textarea输入textarea的长度总是显示 25 那是还怀疑textarea自带有value长度? placeholder属性的长度? 那时候想到类似:ul无序列表li元 ...
- WHU 1538 Stones II 动态规划
赛后写的,动态规划,学长和题解,提供了两种状态设计的思路,都写了下……结果在写第二种的时候,不小心把下标的起点写错了,导致WA了无数发…… 无奈啊……每次都是这种错误…… 题意: 大概就是有n块石头, ...
- linu基础入门(一)
原创作品,允许转载,转载时请务必声明作者信息和本声明. https://www.cnblogs.com/zhu520/p/10730550.html 本人小白,有错指出.谢谢! 一:根据上一步安装与新 ...
- asp.net.core网站重启后登陆无效问题(部署在IIS)
一.问题 在使用asp.net.core时,把网站发布到IIS后,在后续更新中需要停止网站,然后重启网站,发现已经登陆的用户会退出登陆.过程如下 1.登陆代码(测试) [AllowAnonymous] ...
- CRC校验原理及步骤
什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并 ...
- Codeforces Round #313 C. Gerald's Hexagon(放三角形)
C. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Objective-C学习笔记(十)——循环语句for和do-while的使用
在OC中.除了while这样的循环方式外,还有另外for循环和do-while循环.它们在不同的业务逻辑下会有不同的作用.能够和C语言和Java对照着学习. (一)代码一: int main(int ...
- 分布式文件存储FastDFS(一)初识FastDFS
一.FastDFS简单介绍 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.作为一个分布式文件系统,它对文件进行管理. ...
- failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 一.总结 一句话总结:这里出现的问题是我在博客园删除了一篇文章,时 ...