【问题标题】:Encoding not present in HTTP header, how to find it in HTML header? (iPhone)HTTP 标头中不存在编码,如何在 HTML 标头中找到它? (苹果手机)
【发布时间】: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


【解决方案1】:

只是总结我的 cmets 并在答案中添加一些最后的建议。


评论1:

从一般用法,你可以使用ASIHTTPRequest -responseString,否则你可以使用数据本身并使用你自己的逻辑来确定什么类型的编码(UTF8、UTF16等)


评论2:

来自 ASIHTTP 网站:

ASIHTTPRequest 将尝试从 Content-Type 标头中读取接收到的数据的文本编码。如果它找到一个文本编码,它会将 responseEncoding 设置为适当的 NSStringEncoding。如果在标头中没有找到文本编码,它将使用 defaultResponseEncoding 的值(默认为 NSISOLatin1StringEncoding)。 > 当你调用 [request responseString] 时,ASIHTTPRequest 将尝试从它收到的数据中创建一个字符串,使用 responseEncoding 作为源编码。


评论 3

另请参阅:Encoding issue with ASIHttpRequest


我个人建议获取响应数据并假设内容适合 UTF16(或 8)。当然,您也可以使用正则表达式或 HTML 解析器来获取 &lt;head&gt; 元素内的 &lt;meta&gt; 标记,但如果响应是奇怪的内容类型,那么您可能无法找到字符串 @987654326 @

我还将使用您计算机上 CLI 中的 curl 来查看 ASIHTTPRequest 正在获取的内容类型。如果你运行类似的命令

curl -I "http://www.google.com/"

您将收到以下响应:

HTTP/1.1 200 正常

日期:格林威治标准时间 2011 年 8 月 9 日星期二 20:05:00

过期:-1

缓存控制:私有,max-age=0

内容类型:文本/html; charset=ISO-8859-1

似乎几乎所有网站都使用此标头正确响应,如果它们没有正确响应,我认为使用 UTF8 将是一个不错的选择。您能否对给您问题的网站链接发表评论?

【讨论】:

  • 是的,我认为默认为 UTF-8 应该没问题。这是一个在 HTTP 标头中似乎没有编码但在 HTML 标头中有编码的站点:starcitygames.com/magic/standard/…
【解决方案2】:

有没有办法查看 UIWebView 并了解他们是如何做到的?

有。 UIWebViewWebKit 的封装,这是一个开源项目。你可以check out源代码或browse在线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多