【发布时间】:2011-08-09 00:07:13
【问题描述】:
我正在为 iPhone 编写浏览器。
我正在使用
NSString* storyHTML = @"";
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
下载 HTML。问题是有时 HTTP 标头中没有编码,在这种情况下,上面的代码默认为 Latin-ISO。
在这种情况下,我可以读取 HTML 中的标题并找到指定实际编码的元标记。看起来像这样:
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
问题是可以在元标记中找到大量可能的编码,如下所示:http://www.iana.org/assignments/character-sets
我需要一些如何将这些编码字符串之一转换为 NSString 类中的常量编码之一:
enum {
NSASCIIStringEncoding = 1,
NSNEXTSTEPStringEncoding = 2,
NSJapaneseEUCStringEncoding = 3,
NSUTF8StringEncoding = 4,
NSISOLatin1StringEncoding = 5, ...
必须有一个类可以为您确定 HTML 的编码。有没有办法查看 UIWebView 并看看他们是如何做到的?
似乎下载 HTML 应该很容易,我错过了什么?
谢谢!
【问题讨论】:
-
你为什么关心编码?从我使用的内容来看,ASIHTTPRequest 非常方便,如果您只使用请求的
responseString(作为 HTML)应该没有任何问题。您可以直接将此字符串传递给 UIWebView 等。 -
ASIHTTPRequest 不适用于每个网站。例如此站点:starcitygames.com/magic/misc/… 在 HTTP 标头中没有编码,但在 HTML 标头中有编码。结果是一些字符被搞砸了。但是,如果直接发送到 URL,UIWebView 会正确处理它。我希望我知道他们是怎么做到的……
-
根据 ASIHTTPRequest 的站点:> "ASIHTTPRequest 将尝试从 Content-Type 标头中读取接收到的数据的文本编码。如果找到文本编码,它将设置 responseEncoding 为适当的 NSStringEncoding。如果在标头中没有找到文本编码,它将使用 defaultResponseEncoding 的值(默认为 NSISOLatin1StringEncoding)。 > 当您调用 [request responseString] 时,ASIHTTPRequest 将尝试使用它接收到的数据创建一个字符串,使用 responseEncoding作为源编码。”
-
这似乎仍然无法解决问题。引用提到他们正在寻找 HTTP 标头而不是 HTML 标头中的 Content-Type。一些网站在 HTML 标头中包含内容类型,但不在 HTTP 标头中。在这种情况下,ASIHTTPRequest 需要一些其他代码来检查 HTML 标头。另一篇文章中的建议是默认使用 UTF-8……这不是一个坏主意,因为似乎大多数网站可能是 UTF-8 而不是 NSISOLatin1,但不是一个完美的解决方案……另外,我感谢反馈.谢谢。
标签: iphone html encoding content-type