0

我现在正在处理带有文件的 Obj-C,我的应用程序将读取一些具有 UTF16 字符编码的巨大文本文件(例如 5 MB)。第一个问题是如何检测我要处理的文件大小从 ?

第二个问题是当我只阅读一次文件时,它给了我正确的文本,但是当我尝试寻找或阅读另一次时,它不会给我原始文本,这是我的代码段:

NSFileHandle *源文件;

NSData *d1;

NSString *st1,*st2 = @"";

sourceFile = [NSFileHandle fileHandleForReadingAtPath : filePath]; // 我的文件大小是 5 MB

对于 (int i = 0; i < 500; i ++) {

d1 = [源文件读取数据长度:20];

st1 = [[NSString alloc] initWithData:d1 编码:NSUTF16StringEncoding]; // 将我的原始数据转换为 UTF16 字符串

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

st1 = @"";

}

[源文件关闭文件];

执行完之后,st2 会携带一些字符串,这个字符串会有一些清晰的字符(如在原始文件中),但随后会携带一堆不清晰的字符(例如䠆⠆䀆䀆䀆ㄆ䌆✆⨆䜆) ..我整晚都没有睡觉试图弄清楚,但不能:(

4

2 回答 2

1

@Neovibrant:抱歉,您错了,但 UTF-16 并不总是每个字符 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];

第二个问题是因为 UTF-16 编码。您会看到,在 UTF-16 中,一个字符由 2+ 个字节表示(http://en.wikipedia.org/wiki/UTF-16)。

假设您有一个 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 回答