[Tips] - (NSString*)initWithData:encoding:
2tch制作中に気づいたことだが,subject.txtをデコードしようとすると,NSDataがたまにデコードに失敗する.
デコード対象サンプル(2chのsubject.txtです.権利的に問題があれば削除します)
なんでだろう・・・・.
ということで,文字化けするファイルから,改行コードをバイナリでサーチし,一行切り取ってデコードしてみたところ,デコード成功.????どういうこと?
decodeNSDataの中身は,ただのinitWithData:encoding:で,順番に色々な文字コードでデコードをしていく関数.
NSData *data = [NSData dataWithContentsOfFile:@"/Users/sonson/Desktop/subject.txt"]; int length = [data length]; char*p = [data bytes]; int i,head = 0; for( i = 0; i < length; i++ ) { id pool = [[NSAutoreleasePool alloc] init]; char c = *p++; if( c == 10 ) { NSData *sub = [data subdataWithRange:NSMakeRange( head, i-head )]; NSLog( decodeNSData( sub ) ); head = i + 1; } [pool release]; }
上記のコードでは,改行があるところまで読み込んで,デコードするように実装した.
んで,さらに行数を増やしながらデコードしたところ,ある行数からデコードに失敗しやがる.
NSData *data = [NSData dataWithContentsOfFile:@"/Users/sonson/Desktop/subject.txt"]; int length = [data length]; char*p = (char*)[data bytes]; int i; for( i = 0; i < length; i++ ) { id pool = [[NSAutoreleasePool alloc] init]; char c = *p++; if( c == 10 ) { NSData *sub = [data subdataWithRange:NSMakeRange( 0, i )]; NSString *decoded = decodeNSData( sub ); NSLog( decoded ); } [pool release]; }
んで,さらにつっこんで,失敗の原因がデコード対象のサイズにあるのでは?失敗する行数と成功する行数の間で境界を探してみた.
39295バイト当たりから失敗し始める.
とは言っても,別のsubject.txt(しかもサイズがさらにでかいもの)では失敗しなかったので・・・.原因不明.
とりあえず,対策は・・・・・行単位で切り出しかなぁ・・・.