0

私は現在、ファイルを使用して Obj-C に取り組んでいます。私のアプリケーションは、UTF16 の文字エンコーディングを持ついくつかの巨大なテキスト ファイル (たとえば 5 MB) を読み取る必要があります。から読む?

2番目の問題は、ファイルを1回だけ読み取ったときに正しいテキストが得られるが、別の時間をシークまたは読み取ろうとすると、元のテキストが得られないことです。これが私のコードセグメントです:

NSFileHandle *sourceFile;

NSData *d1;

NSString *st1,*st2 = @"";

sourceFile = [NSFileHandle fileHandleForReadingAtPath : filePath]; // 私のファイルのサイズは 5 MB です

for (int i = 0; i < 500; i ++) {

d1 = [sourceFile readDataOfLength:20];

st1 = [[NSString alloc] initWithData:d1 encoding:NSUTF16StringEncoding]; // 生データを UTF16 文字列に変換します

st2 = [st2 stringByAppendingFormat:@"%@",st1];

st1 = @"";

}

[sourceFile closeFile];

これが実行された後、st2 はいくつかの文字列を運び、この文字列には (元のファイルのように) 明確な文字が含まれますが、不明な文字の混乱が発生します (例: 䠆⠆䀆䀆䀆ㄆ䌆✆⨆䜆) .. 私はそれを理解しようとして一晩中寝ていませんでしたが、できませんでした:(

4

2 に答える 2

1

@Neovibrant:間違って申し訳ありませんが、UTF-16は常に1文字あたり2バイト(または16ビット)であるとは限りません。ウィキペディアの記事にあるように、U + 10000を超えるすべての文字で4バイトになる可能性があります...したがって、これで4バイトの文字を切り捨てることができるため、オフセットが均等になるように注意するだけでは不十分です。最善の方法は、常に正しいエンコーディングを使用し、それをファイルマネージャに任せて文字のサイズを決定することです。

于 2012-03-13T13:31:33.330 に答える
0

ファイルサイズを取得するには、NSFileManager を使用するだけです。

NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:filePath error:nil];
unsigned long long size = [fileAttributes fileSize];

2 つ目の問題は、UTF-16 エンコーディングが原因です。UTF-16 では、文字は 2 バイト以上で表されます ( http://en.wikipedia.org/wiki/UTF-16 )。

text を含む UTF-16 のテキスト ファイルがあるとしますHello。バイトは次のようになります。

00 48 │ 00 65 │ 00 6C │ 00 6C │ 00 6F
   H  │    e  │     l │     l │     o

バイト 0 (または任意のインデックス) から読み取りを開始すると、すべて問題なく、期待どおりの結果が得られます。しかし、奇数バイト (1 など) から読み取りを開始すると、バイトがシフトされるため、すべての文字が台無しになります。

48 00 │ 65 00 │ 6C 00 │ 6C 00 │ 6F
   䠀 │     攀 │    氀 │    氀 │  ?
于 2011-08-26T14:56:53.060 に答える