Objective c 关于NSFileHandle,Obj-C的几个问题

Objective c 关于NSFileHandle,Obj-C的几个问题,objective-c,encoding,nsfilehandle,Objective C,Encoding,Nsfilehandle,我现在正在处理Obj-C文件,我的应用程序将读取一些字符编码为UTF16的大型文本文件(例如5 MB)。。 第一个问题是如何检测要读取的文件大小 第二个问题是,当我只读取一次文件时,它会给我正确的文本,但当我尝试查找或读取另一次时,它不会给我原始文本,下面是我的代码段: NSFileHandle*源文件 NSData*d1 NSString*st1,*st2=@ sourceFile=[nsfilehandlefilehandleforreadingatpath:filePath];//我的文件

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

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

NSFileHandle*源文件

NSData*d1

NSString*st1,*st2=@

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

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

d1=[sourceFile readDataOfLength:20]

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

st2=[st2 stringByAppendingFormat:@“%@”,st1]

st1=@

}

[sourceFile closeFile]


执行此操作后,st2将携带一些字符串,该字符串将具有一些清晰的字符(如原始文件中的字符),但随后它将携带一些不清晰的字符(例如䠆⠆䀆䀆䀆ㄆ䌆✆⨆䜆).. 我整晚都没睡好想弄清楚,但无法:(

要获得文件大小,只需使用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+字节()表示

假设您有一个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
   䠀 │     攀 │    氀 │    氀 │  ?
@新活力: 很抱歉,您弄错了,但UTF-16并不总是每个字符2个字节(或16位)。正如您在维基百科文章中看到的,对于U+10000以上的所有字符,UTF-16可以是4个字节。。。 因此,仅注意偶数偏移量是不够的,因为这样可以截断4字节字符。 最好的方法是始终使用正确的编码,并将其留给文件管理器来确定字符的大小