编码为'utf-8'的编码序列无效。

3

我正在使用std.net.curl模块来获取远程网页的HTML内容。但是我遇到了一些编码问题,不知道该如何解决。像facebook.com这样的页面,我会收到以下错误消息(运行时):

std.net.curl.CurlException@/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]

对于google.com,我获取到了什么(我是否获取到了二进制数据?如何获取?)

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

dlang.org可以正常工作。

问题是:如何正确地读取它?与页面编码无关。

以下是我的D语言代码:

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);
}

提前致谢。

2个回答

4

cast(string)get(page, client) 对于任何非 UTF-8 序列都会失败。

使用独立的 getpost 函数,这些函数根据服务器发送的头信息对内容进行解码,并返回有效的 UTF-8


这些函数是哪些?只调用get(page)而不是什么? - Jack
是的,使用get函数,在 UFCS 下可以这样写:url.get(),我认为看上去很酷。 - dav1d
但我确实需要发送一些头信息。因此,get(page, client) 是非常必要的。感谢 url.get()。 :) - Jack
你可以将自己的 Http 结构体传递给 get 函数,并设置额外的头部信息。 - dav1d

1

curl是否真正支持gzip和deflate编码以及ISO-8859-1字符集?你真的应该自己指定这些头部吗,而不是让curl自己声明它支持的编码和字符集吗?

回答你的问题:

问题是:独立于页面编码,正确的阅读方式是什么?

您需要查看服务器发送给您的标头,其中包含页面编码和字符集,然后根据这些标头解释数据(例如,调用zlib对数据进行解压缩,然后将解压缩的HTML转换为UTF-8)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接