Skip to content

wget目录/文件名中文乱码

首先:解决字符界面的编码一致性

Windows的默认编码是:zh_CN.gb2312

所以在通过wget下载文件含有中文名目录/文件时,需要将LANG环境设为相同的编码值

vim /etc/sysconfig/i18n
LANG="zh_CN.gb2312"
SUPPORTED="zh_CN.UTF-8:zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
#保存退出,执行如下命令
export LANG="zh_CN.gb2312"

 

然后:解决wget下载过程encode问题

wget下载地址:https://ftp.gnu.org/gnu/wget/ 

在wget的源代码中 src/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() 函数

/* 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; 

修改完后再编译安装

方法二:修改 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命令下载

含有中文字符的文件/目录 就可以正常的下载到该文件了。

 
Published in运维工具

One Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注