我正在尝试使用stringWithContentsOfURL:encoding:error:
使用NSUTF8StringEncoding
获取网页的内容。问题是网页有invfild utf-8字节,所以方法返回nil。我怎么能处理invaild utf-8字节?。
我尝试过的事情。
NSString.h
和CFStringEncodingExt.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`
答案 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;
}