这里是一些代码,我用它来将文本文件拉入名为 textView
的 UITextView
中。
因为我无法总是提前知道文件的编码,所以我使用方法 -stringWithContentsOfFile:usedEncoding:error:
,它通过引用存储编码值。
一旦获得编码,我就会打开文件,如果出现错误,则打印出一些信息:
NSError *_error = nil;
NSStringEncoding _textEncoding;
NSString *_contentText = [NSString stringWithContentsOfFile:[baseURL path] usedEncoding:&_textEncoding error:&_error];
if (_error) {
NSLog(@" _error: %@", [_error userInfo]);
NSLog(@" _textEncoding: %d", _textEncoding);
}
textView.text = _contentText;
在 iPhone 上,如果文件是 UTF8 编码的, TextView 将正确显示文件的内容。
在 iPhone 上,如果文件是 ASCII 编码的 (NSASCIIStringEncoding
),那么我会得到一个奇怪的字符串编码值:
2010-07-23 02:57:46.786 App[9160:307] _error: {
NSFilePath = "/var/mobile/Applications/0AD83E02-7A2A-4665-8B8F-17E03EE12B9E/Documents/A+B.txt";
}
2010-07-23 02:57:46.791 App[9160:307] _textEncoding: 805298632
对于 NSASCIIStringEncoding
我应该得到一个值 1,而不是 805298632。
不同的是,如果我通过模拟器打开文件,我会得到正确的编码值,并且 TextView 会显示 ASCII 编码文件的内容。
我认为我的语法是正确的,但我想我错过了一些可能很明显的东西。我在这里做错了什么?
最佳答案
- stringWithContentsOfFile:usedEncoding:error: 失败。记录错误详细信息以确定原因。
- 格式说明符应为
%lx
。NSStringEncoding
是一个NSUInteger
,它是设备上的一个unsigned long
。一些枚举值是十六进制值。 - 文件是在什么平台上创建的?您确定编码实际上是 ASCII 吗?您需要对文件执行十六进制转储以验证编码是否有效。
- 尝试将
_textEncoding
初始化为 0。枚举常量从 1 开始。 - 添加一个防护,以在传递到 View 之前测试返回的字符串不为 nil。根据documentation如果出现错误,则返回 nil。
关于iphone - 如何可靠地将未知编码的文本文件拉入 iPhone 上的 NSString 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3317263/