wget中文乱码解决方案

wget 是一个命令行的下载工具。对于很多Linux 用户来说,几乎每天都在使用它.用处大大的,不仅可以平常 的下载,而且可以镜像整个网站.最关键的一点是,它不会像windows中的webZIP一样,因为你不交钱,就在下载回来的网页中嵌入广告.呵呵

wget非常高效,但是国际化程度显然还不够.在下载过程中,如果遇到文件名中有中文的话,十有八九下载回来的文件会是一堆乱码.
当时在镜像codex.wordpress.org和w3school的时候我就遇到了.但是经过google之后解决了.

今天我又查了一下,网上有人已经找到了原因,原文情点击此处
在wget的源代码中,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()函数对特殊字符的判断中排除中文字符。

解决方法呢,倒是找到不止一种,但是我看了,基本上都是对这个url_file_name函数或者是FILE_CHAR_TEST 这个宏定义进行修改.
方法一,修改url_file_name()函数
wget1.12版本源代码中 url.c文件 第1402行的
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;

方法二,修改FILE_CHAR_TEST宏定义
将url.c中的
  #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)) /* 排除中文 */

然后再重新编译即可

看上面两个方法,都是排除中文,而且处理的方法都很类似.明眼的你肯定看出来了吧.呵呵

原来在镜像网站的时候不记得找到的是哪种方法了.而且还找到一个人家编译好的wget文件,下载下来直接覆盖就好了.这里给大家分享一下.
将下载下来的文件,覆盖到/usr/bin/就好了.
如果在使用命令的时候提示没有权限,就使用命令
sudo chmod a+x /usr/bin/wget
增加执行权限即可
防乱码wget文件 点击此处下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题中提到的乱码问题是指在使用wget下载网页时,如果文件名含有非ASCII字符或其他特殊字符,会出现乱码的情况。解决这个问题有多种方法。 一种方法是在使用wget下载时,添加参数"--restrict-file-name=ascii",这样wget会将文件名限制为ASCII字符,从而避免乱码的问题。例如: wget --restrict-file-name=ascii -m http://ebook.elain.org [2] 另一种方法是修改wget的源代码,具体地说是修改url.c文件中的url_file_name()函数和相关宏。在FILE_CHAR_TEST()宏中,将中文字符当作普通字符对待,不进行URL编码。修改后的宏如下所示: #define FILE_CHAR_TEST(c, mask) \ ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \ (!(filechr_table[(unsigned char)(c)] & (mask)))) 通过修改源代码,可以实现不对中文进行转义,从而解决中文乱码问题。需要注意的是,修改源代码需要具备一定的编程能力,并且需要重新编译wget才能生效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [解决wget下载文件名乱码的一些方法](https://blog.csdn.net/weixin_34005042/article/details/93689789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值