2

stringWithContentsOfURL:encoding:error:を使用して Web ページのコンテンツを取得しようとしていNSUTF8StringEncodingます。問題は、Web ページに無効な 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、16 進数のように見えます

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

2 に答える 2

1

無効なUnicode文字を破棄するiconvapiを使用してこれを行う方法を見つけました。

以前NSISOLatin1StringEncodingはURLをダウンロードしていました。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 に答える
1

これがWebページに使用するのに最適なエンコーディングであると確信していますか?おそらく、代わりに次を使用する必要があります。

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

このメソッドは、使用するのに最適なエンコーディングを決定し、それをで返しますenc

于 2012-08-12T02:53:27.293 に答える