中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]curl,wget目前有能处理中文文件名的版本吗?
作者:
标题: [求助]curl,wget目前有能处理中文文件名的版本吗? 上一主题 | 下一主题
w524e
新手上路





积分 14
发帖 10
注册 2008-7-19
状态 离线
『楼 主』:  [求助]curl,wget目前有能处理中文文件名的版本吗?

搜到了2008年的一个帖子 URL   现在还是无解吗?

  Quote:
wget中文乱码wget中文乱码 2008年04月19日  昨天打算用wget把kerneltravel上的深入分析Linux内核源码全部下载到本机,没想到使用wget下载到本地时文件名全部是乱码:  [cocobear@cocobear ~]$ wget -r -p -k -np http://www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html –19:52:02– http://www.kerneltravel.net/kern ... BA%90%E7%A0%81.html => `www.kerneltravel.net/kernel-book/深�%85��%88%86�%9E%90Linux�%86%85核��%90��%81.html’ 正在解析主机 www.kerneltravel.net… 202.75.211.215 Connecting to www.kerneltravel.net|202.75.211.215|:80… 已连接。 已发出 HTTP 请求,正在等待回应… 200 OK 长度:133,528 (130K) [text/html]  100%[====================================>] 133,528 60.71K/s  19:52:05 (60.57 KB/s) – `www.kerneltravel.net/kernel-book/深�%85��%88%86�%9E%90Linux�%86%85核 ��%90��%81.html’ saved [133528/133528]  google了半天也没有找到解决方案,似乎也有不少人碰到这个问题。仔细想了想应该是wget在处理url时的问题,于是下载了最新的wget源代码开始找问题。  基本看完了main.c这个文件,后来在url.c这个文件里找到了wget如何处理保存的文件名,url_file_name()这个函数。  url_file_name()在根据url的形式判断该保存为什么样的文件名,并进行了多方面的考虑,最终该函数调用了append_uri_pathel(),该函数会判断url中的特殊字符,例如空格等,如果遇到这些字符wget把它进行转义,而问题就出在这里,append_uri_pathel()函数是通过FILE_CHAR_TEST (*p, mask)这一句来判断该字符是否为特殊字符,而同时它会认为中文也是特殊字符,然后按照转换空格之类的方式对中文进行转义,这样就会造成中文乱码的情况,知道了问题所在我在append_uri_pathel()函数对特殊字符的判断中排除了中文字符。  接下来重新编译wget,再试一次:  [cocobear@cocobear src]$ ./wget -r -p -k -np http://www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html –2008-04-19 20:16:34– http://www.kerneltravel.net/kern ... BA%90%E7%A0%81.html Resolving www.kerneltravel.net… 202.75.211.215 Connecting to www.kerneltravel.net|202.75.211.215|:80… connected. HTTP request sent, awaiting response… 200 OK Length: 133528 (130K) [text/html] Saving to: `www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html’  74% [===========================> ] 98,832 79.7K/s  可以看到wget可以正确的把中文的网页保存下来了:-)  我的locale是utf-8,如果使用gbk的话wget上面的网页会得到404错误,因为gbk环境下wget发出来GET请求是按照gbk编码的方式进行转义,而服务器对接收到的GET请求中的URL是按照UTF-8的方式进行“解码”,因此会得到404的错误。(早上测试的时候还是这样的,但下这会写这篇文章的时候gbk环境下使用wget也正常了,郁闷)  以下是我修改后的url.c与原文的diff: [cocobear@cocobear ~]$ diff -u wget-1.11.1/src/url.c Codes/wget-1.11.1/src/url.c — wget-1.11.1/src/url.c 2008-04-19 11:42:24.000000000 +0800 +++ Codes/wget-1.11.1/src/url.c 2008-04-19 11:56:49.000000000 +0800 @@ -1332,11 +1332,10 @@ /* Walk the PATHEL string and check how many characters we’ll need to quote. */ quoted = 0; - for (p = b; p < e; p++) { - if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff)) { + for (p = b; p < e; p++) + if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff)) ++quoted; - } - } + /* Calculate the length of the output string. e-b is the input string length. Each quoted char introduces two additional characters in the string, hence 2*quoted. */  以上仅仅是我自己对wget的一些分析、看法,如有错误请路过的指正一下。  BTW: (1):http://www.sfr-fresh.com这个网站不错,有不少源代码在上面可以在线看。 (2):深入分析Linux内核源码这本书打包下载(html格式):http://cocobear.info/download/Understand_Linux_kernel.tar.bz2  Update1(08.4.20): 这个问题是wget对国际化的字符支持不好,目前google summer code已经有人在这方面进行改进,期待。我的解决方案只是临时的,只能针对utf-8环境。



2010-7-12 19:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 2 楼』:  

windows上面的wget支持中文。其他系统不知道了

2010-7-13 11:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
w524e
新手上路





积分 14
发帖 10
注册 2008-7-19
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by nanhezzb at 2010-7-13 11:35:
windows上面的wget支持中文。其他系统不知道了

不行啊. 你试试
wget http://www.kerneltravel.net/kernel-book/%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90Linux%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81.html
下来的文件名是
æ·±å%85¥å%88%86æ%9E%90Linuxå%86%85æ ¸æº%90ç %81.html
系統是: windows xp sp3. Wget 1.10.2和Wget 1.11.4都试了

另, 加-o参数指定文件名,在大量文件和要保留服务器文件名时不实用

[ Last edited by w524e on 2010-7-13 at 18:24 ]

2010-7-13 18:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 4 楼』:  

我以为你说的下载路径中含有中文。

WGET.exe -O 1.html http://www.kerneltravel.net/kern ... BA%90%E7%A0%81.html

这样将这些文件下载的时候重命名下应该不会又什么影响吧?

[ Last edited by nanhezzb on 2010-7-14 at 11:17 ]

2010-7-14 11:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
w524e
新手上路





积分 14
发帖 10
注册 2008-7-19
状态 离线
『第 5 楼』:  

一两个文件还好....几十上百个就不知道谁是谁了....

2010-7-14 15:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 6 楼』:  

方法:
将要下载的URL放在一个文本中,使用for来下载,将文件名!n!
set /a  n=0
for /f "delims="  %%a in (url.txt) do (
set dl_url=%%a
call :download
set /a n+=1
)
pasue&exit
wget -O !n!.html !dl_url!


不过建议你还是先将下载文件的URL的编码转换成中文之后再下载。

[ Last edited by nanhezzb on 2010-7-14 at 20:39 ]

2010-7-14 20:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 7 楼』:  

charset=utf-8"

2010-7-29 17:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: