2

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

我尝试过的事情。

  • 尝试使用NSString.h和中的每个编码CFStringEncodingExt.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`
4

2 回答 2

1

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

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

此方法确定为您使用的最佳编码并将其返回为enc.

于 2012-08-12T02:53:27.293 回答
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;

}

于 2012-08-14T21:43:50.340 回答