Cocoa:如何在网页中处理无效的utf-8字节

时间:2012-08-12 01:52:20

标签: cocoa url unicode encoding nsstring

我正在尝试使用stringWithContentsOfURL:encoding:error:使用NSUTF8StringEncoding获取网页的内容。问题是网页有invfild utf-8字节,所以方法返回nil。我怎么能处理invaild utf-8字节?。

我尝试过的事情。

  • 尝试使用NSString.hCFStringEncodingExt.h
  • 中的所有编码
  • 使用NSISOLatin1StringEncoding,然后删除无效字节,然后执行

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

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

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

使用iconv无效字符似乎是{16}中的EF BF BD

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

2 个答案:

答案 0 :(得分:1)

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

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

此方法确定要用于您的最佳编码,并在enc中返回。

答案 1 :(得分:1)

我找到了一种方法,使用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;

}