【问题标题】:Cocoa: How to handle invalid utf-8 bytes in a webpageCocoa:如何处理网页中的无效 utf-8 字节
【发布时间】:2012-08-12 01:52:20
【问题描述】:

我正在尝试使用stringWithContentsOfURL:encoding:error: 使用NSUTF8StringEncoding 获取网页的内容。问题是网页的 utf-8 字节无效,因此该方法返回 nil。我将如何处理无效的 utf-8 字节?

我尝试过的事情。

  • 尝试使用NSString.hCFStringEncodingExt.h 中的每个编码
  • 使用 NSISOLatin1StringEncoding,然后删除无效字节然后做

    [NSString stringWithCString:[str cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];

  • stringWithContentsOfURL:usedEncoding:error: 导致日文 Unicode 字符乱码。

我正在使用的网页http://vgmdb.net/album/32234

使用iconv 无效的字符似乎是十六进制的EF BF BD

`iconv -c -f UTF8 -t UTF8 32234.html`

【问题讨论】:

    标签: cocoa url unicode encoding nsstring


    【解决方案1】:

    您确定这是用于网页的最佳编码吗?也许你应该改用:

    + (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
    

    此方法确定最适合您使用的编码并将其返回到enc

    【讨论】:

    • 我试过这个,它导致日文 Unicode 字符显示为乱码
    • 它告诉您哪种编码最适合用于该页面? (返回enc
    • nsisolatin1stringencoding 弄乱了日文字符。
    【解决方案2】:

    我找到了一种使用 iconv api 丢弃无效 unicode 字符的方法。

    我使用NSISOLatin1StringEncoding 下载网址。我将其转换为NSData 在其上运行cleanUTF8:data,然后使用NSUTF8StringEncoding 读取数据。这是我能找到的让日文和其他 unicode 字符正确显示的唯一方法。

    - (NSData *)cleanUTF8:(NSData *)data {
    // Make sure its utf-8
    iconv_t ic= iconv_open("UTF-8", "UTF-8");
    // Remove invaild characters
    int one = 1;
    iconvctl(ic, ICONV_SET_DISCARD_ILSEQ, &one);
    
    size_t inBytes, outBytes;
    inBytes = outBytes = data.length;
    char *inbuf  = (char*)data.bytes;
    char *outbuf = (char*) malloc(sizeof(char) * data.length);
    char *outptr = outbuf;
    
    if (iconv(ic, &inbuf, &inBytes, &outptr, &outBytes) == (size_t) - 1) {
        assert(false);
        return nil;
    }
    
    NSData *result = [NSData dataWithBytes:outbuf length:data.length - outBytes];
    iconv_close(ic);
    free(outbuf);
    return result;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      相关资源
      最近更新 更多