在下载用apache或者nginx做的索引目录时,遇到文件名乱码问题。搜索了不少资料,尝试了好几种方案,大家可以结合使用。

一般情况下加上–restrict-file-names=nocontrol参数就可以用了。

其实除了下面方法一和方法二外,还有一个大家可以自由发挥的,我是没有研究透,编码实在太让自己头疼了。

有一个前提,要注意索引目录显示出来的是什么编码,比如有些网站是UTF-8(这个应该比较正规,中文不会出现很大麻烦,可以用方法二搞定),有些是GBK,可能跟文件的编码,或者apache、nginx的设置有关吧。

1、下载的时候保存成ascii,跟方法三类似

? Download download.txt
1
wget --restrict-file-names=ascii -m www.xxx.com/

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,就可以了。
完整命令为

? Download download.txt
1
wget --restrict-file-names=nocontrol -m http://ebook.elain.org

(我解释的不专业请看正文,发觉编码好混乱哎)

《使用 wget 整站下载》
转自http://blog.csdn.net/kowity/article/details/6899256

最近发现一个很好的网站:http://ebook.elain.org,里面有大量的技术书籍。于是想使用 wget 把整个网站都下载下来。但是 wget 对中文的 url 支持得不够好,直接使用:

? Download download.txt
1
  wget -m http://ebook.elain.org

下载的话,中文文件名就会乱码,比如“2010架构师大会PPT”就变成了“2010鏋舵瀯甯堝ぇ浼歅PT”。

? Download download.txt
1
  wget --restrict-file-name=ascii -m http://ebook.elain.org

下载的话,中文文件名会编码成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 写个编码转换器就可以了。代码如下:

? Download download.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import os, urllib, sys, getoptclass Renamer:input_encoding = ""output_encoding = ""path = ""is_url = Falsedef __init__(self, input, output, path, is_url):self.input_encoding = inputself.output_encoding = outputself.path = pathself.is_url = is_urldef start(self):self.rename_dir(self.path)def rename(self, root, path):try:if self.is_url:new = urllib.unquote(path).decode(self.input_encoding).encode(self.output_encoding)else:new = path.decode(self.input_encoding).encode(self.output_encoding)os.rename(os.path.join(root, path), os.path.join(root, new))except:passdef rename_dir(self, path):for root, dirs, files in os.walk(path):for f in files:self.rename(root, f)if dirs == []:for f in files:self.rename(root, f)else:for d in dirs:self.rename_dir(os.path.join(root, d))self.rename(root, d)
def usage():print '''This program can change encode of files or directories.Usage:   rename.exe [OPTION]...Options:-h, --help                  this document.-i, --input-encoding=ENC    set original encoding, default is UTF-8.-o, --output-encoding=ENC   set output encoding, default is GBK.-p, --path=PATH             choose the path which to process.-u, --is-url                whether as a URL'''def main(argv):input_encoding = "utf-8"output_encoding = "gbk"path = ""is_url = Truetry:opts, args = getopt.getopt(argv, "hi:o:p:u", ["help", "input-encoding=", "output-encoding=", "path=", "is-url"])except getopt.GetoptError:usage()sys.exit(2)for opt, arg in opts:if opt in ("-h", "--help"):usage()sys.exit()elif opt in ("-i", "--input-encoding"):input_encoding = argelif opt in ("-o", "--output-encoding"):output_encoding = argelif opt in ("-p", "--path"):path = argelif opt in ("-u", "--is-url"):is_url = Truern = Renamer(input_encoding, output_encoding, path, is_url)rn.start()if __name__ == '__main__':main(sys.argv[1:])

如果 wget 是使用以下命令行来下载:

? Download download.txt
1
  wget --restrict-file-name=ascii -m http://ebook.elain.org

那么下载下来的文件是“2010%E6%9E%B6%E6%9E%84%E5%B8%88%E5%A4%A7%E4%BC%9APPT”形式,运行脚本时就使用以下命令:

? Download download.txt
1
  rename.py -i utf-8 -o gbk -p R:\ebook.elain.org -u

方法二
改wget源代码

moper:不推荐这种方法,因为比较麻烦,我也没有测试,可能这种效果会好一些吧。

文章一《wget中文乱码解决方案》

用wget下载网页时,若文件名含有非ASCII字符或其他特殊字符,就会出现所谓的乱码。若想解决中文乱码的问题,可以修改wget的源代码。
对URL字符串进行编码的源代码文件是url.c。其中,url_file_name()的功能是根据URL判断应该以什么文件名保存文件。而该函数又调用了append_uri_pathel(),该函数调用了FILE_CHAR_TEST()宏,它用于判断URL中的字符是不是特殊字符(也就是需要进行URL编码的字符。当然,包括中文)。问题就出在这个宏身上了。为了不对中文转义,需要将中文字符当作普通字符对待。将如下所示的FILE_CHAR_TEST()宏:

? Download download.txt
1
2
3
#define FILE_CHAR_TEST(c, mask) \((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \(filechr_table[(unsigned char)(c)] & (mask)))

修改为:

? Download download.txt
1
2
3
4
#define FILE_CHAR_TEST(c, mask) \
(((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
(filechr_table[(unsigned char)(c)] & (mask))) \
&& !((c|0x0fffffff) == 0xffffffff)) /* 排除中文 */

文章二《解決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()宏:

? Download download.txt
1
2
3
  #define FILE_CHAR_TEST(c, mask) \((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \(filechr_table[(unsigned char)(c)] & (mask)))

修改為:

? Download download.txt
1
2
3
4
  #define FILE_CHAR_TEST(c, mask) \(((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \(filechr_table[(unsigned char)(c)] & (mask))) \&& !((c|0x0fffffff) == 0xffffffff)) /* 排除中文 */

  另外,如果使用unicode編碼方案的話,就不會出現上述第二種亂碼。因此,可以將瀏覽器端的字符編碼環境設置為unicode。這裡,選擇UTF-8編碼方案(UCS Transformation Format)。方法是在main.c的i18n_initialize最後加上:

? Download download.txt
1
'setlocale(LC_CTYPE, "zh_CN.UTF-8");'


  這不是一個很好的解決方案。另外,它沒辦法解決其他語言的亂碼問題。當然,可以將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

转载于:https://www.cnblogs.com/yisuo/p/9462679.html

解决wget下载文件名乱码的一些方法相关推荐

  1. 解决wget下载中文乱码的方法

    在下载用apache或者nginx做的索引目录时,遇到文件名乱码问题.一般情况下加上–restrict-file-names=nocontrol参数就可以用了. 有一个前提,要注意索引目录显示出来的是 ...

  2. java下载文件名乱码的解决方法

    java下载文件名乱码的解决方法 参考文章: (1)java下载文件名乱码的解决方法 (2)https://www.cnblogs.com/liyabin/p/7891073.html 备忘一下.

  3. java文件名的编码格式_java下载文件名乱码解决方法详解

    java下载文件名乱码的方法:(推荐:java视频教程) 每个浏览器的编码不一样,火狐采用的是base64.ie和谷歌采用的是url编码: 所以我们在设置响应头的时候Content-Type getS ...

  4. java解压缩文件名乱码_解决JDKZipEntry压缩文件名乱码的两种方法

    当我们在创建java的项目过程中,有时候会遇到一些棘手的问题,就比如说:在JDk zipEntry压缩中文文件名出现乱码的问题.那么对于这个问题,我们应该怎样来解决呢?今天我们就一起来学习一下它的解决 ...

  5. php ie 下载 乱码,php ie下载文件名乱码怎么办

    php ie下载文件名乱码的解决办法:1.通过header方法解决乱码:2.通过"function remote_filesize($uri,$user='',$pw='') {...}&q ...

  6. IE浏览器下载文件名乱码

    解决IE浏览器下载文件名乱码额问题 //下载的文件名为fileNameString fileName = "登录登出日志统计" + DateUtils.yyyyMMddHHmmss ...

  7. u盘文件名乱码的恢复方法

    文件名全部变乱码了怎么恢复?U盘数据恢复方法 电脑里的目录文件名乱码了,这是什么状况呢?好端端的电脑突然就成这个样子了,真是令人摸不着头脑,对于这样的状况,多半是文件类型引起的,那么接下来还是让小编给 ...

  8. 火狐浏览器下载文件名乱码

    ##火狐浏览器下载文件名乱码 response.setHeader("Content-Disposition","attachment;filename*=utf-8'z ...

  9. java web 下载文件名乱码

    Web开发下载文件功能(代码如下),文件名如果带有中文,经常会出现乱码现象,需要进行编码. String fileName = "测试文件.doc"; try {HttpServl ...

最新文章

  1. linu逻辑分区动态调整大小
  2. SQL Server 执行计划
  3. asp.net中page对象生命周期和各事件执行顺序
  4. C++_引用变量探究
  5. java 抢单功能设计_java毕业设计_springboot框架的抢单兼职
  6. 深入理解 sudo 与 su 之间的区别
  7. linux 连接两个异构网,如何在Linux(或异构)网络上共享计算机?
  8. POJ2752-Seek the Name, Seek the Fame【KMP】
  9. MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)
  10. pandas追加写入行、列
  11. 服务机器人分类包括哪些?
  12. 一款开源的轻量级企业流程开发平台,源码分享
  13. 企业为何需要在内部推广Devops
  14. java 吸血鬼数字_用java求吸血鬼数字 | 学步园
  15. 洛谷 P3460 [POI2007]TET-Tetris Attac
  16. ARM架构—— Cortex-M3与Cortex-M4特点概述
  17. GO WEB IRIS入门 安装iris
  18. 出来做SEO“早晚要还的”
  19. 【玩转ESP32】5、i2c-tools访问i2c设备
  20. office文件在线预览

热门文章

  1. docker build --build-arg 传参到 Dockerfile
  2. Spring的详细解读
  3. 『中级篇』docker企业版本地安装之UCP(57)
  4. Openfire简单教程
  5. 解析linux网络输出,Linux echo详解:输出命令
  6. csdn 最小向量乘积
  7. wifi pineapple | WiFiPineapple plus 基本使用教程
  8. LR_脚本函数构成一:
  9. 人民币转大写c语言,大写换算(人民币换算器)
  10. Ubuntu16.04下qq安装历程