2012-08-15 7 views
3

웹 페이지에서 HTML을 가져 오기 위해 std.net.curl 모듈을 사용하고 있습니다. 하지만 인코딩 문제는 해결할 방법이 없습니다. 나는 (? 내가 바이너리를 얻고 어떻게?)받을'utf-8'의 인코딩 순서가 잘못되었습니다.

�S��7�砱�y�����g�d��C���|��W��O�s��~����*6��@�4�&�A�J����r▒4=�FT�e�� [...] 

dlang.org를 들어 그것을 잘 작동, google.com를 들어

[email protected]/usr/include/d/dmd/phobos/std/net/curl.d(800): Invalid encoding sequence for enconding 'utf-8' 
---------------- 
./foo(char[] std.net.curl._decodeContent!(char)._decodeContent(ubyte[], immutable(char)[])+0xf6) [0x812e6ba] 
./foo(char[] std.net.curl._basicHTTP!(char)._basicHTTP(const(char)[], const(void)[], std.net.curl.HTTP)+0x28e) [0x80f89f6] 
./foo(char[] std.net.curl.get!(std.net.curl.HTTP, char).get(const(char)[], std.net.curl.HTTP)+0x8f) [0x80f8737] 
./foo(immutable(char)[] teste.get_html(immutable(char)[])+0x112) [0x80f0806] 
./foo(_Dmain+0x5f) [0x80f06e3] 
./foo(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x14) [0x8138340] 
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x18) [0x8137e50] 
./foo(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x32) [0x8138382] 
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x18) [0x8137e50] 
./foo(main+0x94) [0x8137e04] 
/lib/libc.so.6(__libc_start_main+0xf3) [0xb7593003] 

: 일부 페이지는 facebook.com처럼 나는 다음과 같은 오류 메시지 (실행 시간)을 얻는다.

질문 : 읽는 올바른 방법은 무엇입니까? 페이지 인코딩과 독립적입니다. 사전에

string get_html(string page) { 
    auto client = HTTP(); 
    client.clearRequestHeaders(); 
    client.addRequestHeader("DNA", "1"); 
    client.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    client.addRequestHeader("Accept-Encoding", "gzip, deflate"); 
    client.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"); 
    client.addRequestHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 

    return cast(string)get(page, client); 
} 

감사 :

여기 내 D 코드입니다.

답변

4

cast(string)get(page, client)UTF-8 시퀀스가 ​​아닌 경우 실패합니다.

독립 실행 형 getpost 기능을 사용하면 서버의 보낸 헤더에 따라 내용을 디코딩하고 유효한 UTF-8을 반환합니다.

+0

이러한 기능은 무엇입니까? 대신에'get (page)'만 부르면됩니까? – Jack

+0

예, [get] (http://dlang.org/phobos/std_net_curl.html#get), UFCS는 다음과 같습니다 :'url.get()', 꽤 멋지다. – dav1d

+0

하지만 헤더를 보내야합니다. 그래서,'get (page, client)'가 정말로 필요합니다. 'url.get()'에 감사드립니다. :) – Jack

1

컬은 실제로 gzip 및 deflate 인코딩 및 ISO-8859-1 charset을 지원합니까? 컬 자체가 지원하는 인코딩 및 문자 세트를 선언하는 것과는 대조적으로 실제로이 헤더를 직접 지정해야합니까?

질문은 다음과 같습니다 : 그것을 읽고 올바른 방법은 무엇입니까

귀하의 질문에 대답하려면? 페이지 인코딩과 독립적입니다.

당신은 예를 들어과 gzip 또는 데이터를 팽창하는 ZLIB를 호출 (당신이 그 헤더에 따라 데이터를 해석, 페이지 인코딩과 문자 집합을 포함하는 서버를 보내는 헤더,보고, 다음에 압축 해제 HTML 변환 UTF-8).

관련 문제