wget 중국어 난 장 판 해결 방법

apache 나 nginx 로 만 든 색인 디 렉 터 리 를 다운로드 할 때 파일 이름 의 난 장 판 문제 가 발생 했 습 니 다.일반적인 상황 에서 ㎡ Crestrict - file - names = nocontrol 인 자 를 더 하면 사용 할 수 있 습 니 다.
색인 디 렉 터 리 에 표 시 된 인 코딩 이 무엇 인지 주의해 야 한 다 는 전제 가 있 습 니 다. 예 를 들 어 일부 사 이 트 는 UTF - 8 (이것 은 비교적 정규 적 이 어야 합 니 다. 중국 어 는 * * 번 거 롭 지 않 고 방법 으로 해결 할 수 있 습 니 다) 이 고 어떤 사 이 트 는 GBK 입 니 다. 파일 의 인 코딩 이나 apache, nginx 의 설정 과 관련 이 있 을 수 있 습 니 다.
1. 다운로드 할 때 ascii 로 저장, 방법 3 과 유사
1
wget --restrict-file-names=ascii -m www.xxx.com/

2. 이름 을 바 꾸 는 소프트웨어 를 사용 하면 비비 가 아 이 를 바 꾸 고 RenamePro 8.0 으로 사용 하기 좋 습 니 다.'고급 파일 이름 변경' 에는 '파일 이름 인 코딩 과 디 코딩', 'ANSI 인 코딩 URL 문자열 을 문자 로 변환' 이 있 으 니 많이 시도 해 보 세 요.
3. 만약 에 안 되면 wget 의 일부 매개 변 수 를 연구 할 수 있 습 니 다. 관련 된 것 은 두 가지 가 있 습 니 다.      �Clocal-encoding=ENC      IRI (국제 자원 식별 자) 는 ENC 를 로 컬 인 코딩 으로 사용 합 니 다.      �Cremote-encoding=ENC     기본 원 격 인 코딩 으로 ENC 를 사용 합 니 다.
방법 1 moper: 이 방법 은 파일 이름 을 ascii 로 바 꾸 고 -- restrict - file - name = ascii 인 자 를 추가 한 다음 python 으로 쓴 프로그램 을 win 이 받 아들 일 수 있 는 인 코딩 으로 바 꾸 는 것 입 니 다.사실 우 리 는 다른 매개 변 수 를 추가 하면 됩 니 다.전체 명령
1
wget --restrict-file-names=nocontrol -m http://xxx.xxx.xxx
1
wget --restrict-file-name=ascii -m http://xxx.xxx.xxx

다운로드 하면 중국어 파일 이름 은 URL 형식 으로 인 코딩 됩 니 다. 예 를 들 어 '2010 구조 사 대회 PPT' 는 '2010% E6% 9E% B6% E6% 9E% 84% E5% B8% 88% E5% A4% E4% BC% 9APPT' 가 됩 니 다.주로 웹 페이지 에 서 는 중국어 URL 을 UTF - 8 로 인 코딩 하고, 윈도 메모리 파일 이름 은 GBK 로 인 코딩 하기 때문이다.그 러 니까т㎡ PPT '는 사실상 GBK 인 코딩 으로 표시 되 는 UTF - 8 인 코딩 파일 이름 이다.이렇게 해서 우 리 는 Python 으로 인 코딩 변환기 만 쓰 면 된다.코드 는 다음 과 같 습 니 다:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import os, urllib, sys, getopt
 
class Renamer:
 
    input_encoding = ""
    output_encoding = ""
    path = ""
    is_url = False
 
    def __init__(self, input, output, path, is_url):
        self.input_encoding = input
        self.output_encoding = output
        self.path = path
        self.is_url = is_url
 
    def 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:
            pass
 
    def 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 = True
 
    try:
        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 = arg
        elif opt in ("-o", "--output-encoding"):
            output_encoding = arg
        elif opt in ("-p", "--path"):
            path = arg
        elif opt in ("-u", "--is-url"):
            is_url = True
 
    rn = Renamer(input_encoding, output_encoding, path, is_url)
    rn.start()
 
if __name__ == '__main__':
    main(sys.argv[1:])

wget 이 다음 명령 행 을 사용 하여 다운로드 한다 면:
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" 형식 으로 스 크 립 트 를 실행 할 때 다음 명령 을 사용 합 니 다.
1
  rename.py -i utf-8 -o gbk -p R:\ebook.elain.org -u

방법 2. wget 소스 코드 변경
moper: 이런 방법 은 추천 하지 않 습 니 다. 귀 찮 기 때문에 저도 테스트 를 하지 않 았 습 니 다. 아마 이런 효과 가 좀 좋 을 것 같 습 니 다.
문장 1 < wget 중국어 난 코드 해결 방안 >
wget 으로 웹 페이지 를 다운로드 할 때 파일 이름 에 ASCII 문자 가 아 닌 다른 특수 문자 가 포함 되 어 있 으 면 이른바 난 코드 가 발생 합 니 다.중국어 난 장 판 문 제 를 해결 하려 면 wget 의 소스 코드 를 수정 할 수 있 습 니 다.URL 문자열 을 인 코딩 하 는 소스 파일 은 url. c 입 니 다.그 중 urlfile_name () 의 기능 은 URL 에 따라 어떤 파일 이름 으로 파일 을 저장 해 야 하 는 지 판단 하 는 것 입 니 다.이 함수 가 append 를 호출 하 였 습 니 다.uri_pathel (), 이 함수 가 FILE 를 호출 했 습 니 다.CHAR_TEST () 매크로 는 URL 의 문자 가 특수 문자 인지 아 닌 지 를 판단 하 는 데 사 용 됩 니 다. (즉, URL 인 코딩 이 필요 한 문자 입 니 다. 물론 중국어 포함).문 제 는 바로 이 매크로 에 게 있다.중국어 의 뜻 을 바 꾸 지 않 기 위해 서 는 중국어 문 자 를 일반 문자 로 취급 해 야 한다.다음 과 같은 FILECHAR_TEST () 매크로:
1
2
3
#define FILE_CHAR_TEST(c, mask) \
    ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
    (filechr_table[(unsigned char)(c)] & (mask)))

다음으로 변경:
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)) /*      */

방법 3, url 수정file_name () 함수 wget 1.12 버 전 소스 코드 에서 url. c 파일 1402 줄 의
1
2
3
for (p = b; p < e; p++)
if (FILE_CHAR_TEST (*p, mask))
++quoted;

으로 변경
1
2
3
for (p = b; p < e; p++)
if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff))
++quoted;

좋은 웹페이지 즐겨찾기