将未知编码的TXT文件转换为字符串
Convert TXT File of Unknown Encoding to String
如果编码类型未知,如何将纯文本 (.txt) 文件转换为字符串?
我正在开发一项允许用户将 txt 文件导入我的应用程序的功能。这意味着该文件可以在任意数量的应用程序中创建,使用对纯文本文件有效的各种编码中的任何一种。我的理解是这可能包括(ASCII、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE 或 EBCDIC?!)
使用以下方法一切顺利:
NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&errorReading];
然后用户提供了一个文件,导致导入时内容为空。我在 XCode 调试中查看文件,看到 Cocoa 错误 261,NSStringEncoding=4.
我知道的:
- 用户提供的文件是使用名为 knowtes 的应用程序创建的
- 文件在 Mac OS X
上使用 TextEdit、TextWranger 等打开
- 该文件包含 "special characters" 例如变音符号(咆哮:为什么变音符号上的 "u" 没有变音符号?!)
- Finder 信息显示:
Kind: text
- Terminal -I 输出:
text/plain; charset=utf-16le
我猜文件的 utf-16le 编码是关键,因为我期待 NSUTF8 文件。
我试图使用 ASCII 作为最低公分母。它没有崩溃,但在原始文件中不存在的一些字符被篡改了。
NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&errorReading];
所以我尝试先将文件转换为 NSData,希望它可以消除识别编码的需要。没用。
NSData *txtFileData = [NSData dataWithContentsOfFile:path];
NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSUTF8StringEncoding];
这让我想到了几个问题:
- 是否没有一种通用的方法可以将纯文本文件内容(无论编码如何)转换为字符串(即最小公分母)?我相信这曾经是
initWithContentsOfFile
的目的,不幸的是现在已经弃用了。 ASCIStringEncoding 无效。
- 关于将 NSUTF16 编码文件转换为字符串,我需要以不同于 NSUTF8 的方式处理吗?
假设文件实际上是 URF16LE,为什么下面的 suggestion 也不起作用?
NSString *txtFileAsString = nil;
if (path !=nil) {
NSData *txtFileData = [NSData dataWithContentsOfFile:path];
NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSASCIIStringEncoding];
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF8StringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16StringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16LittleEndianStringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16BigEndianStringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32StringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32LittleEndianStringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32BigEndianStringEncoding];
}}
有时 stringWithContentsOfFile:usedEncoding:error:
可以完成这项工作(特别是如果文件有 Byte Order Mark):
NSError *error;
NSStringEncoding encoding;
NSString *string = [NSString stringWithContentsOfFile:path usedEncoding:&encoding error:&error];
请注意,此带有 usedEncoding
的再现不应与仅具有 encoding
参数的类似命名方法混淆。
如果编码类型未知,如何将纯文本 (.txt) 文件转换为字符串?
我正在开发一项允许用户将 txt 文件导入我的应用程序的功能。这意味着该文件可以在任意数量的应用程序中创建,使用对纯文本文件有效的各种编码中的任何一种。我的理解是这可能包括(ASCII、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE 或 EBCDIC?!)
使用以下方法一切顺利:
NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&errorReading];
然后用户提供了一个文件,导致导入时内容为空。我在 XCode 调试中查看文件,看到 Cocoa 错误 261,NSStringEncoding=4.
我知道的:
- 用户提供的文件是使用名为 knowtes 的应用程序创建的
- 文件在 Mac OS X 上使用 TextEdit、TextWranger 等打开
- 该文件包含 "special characters" 例如变音符号(咆哮:为什么变音符号上的 "u" 没有变音符号?!)
- Finder 信息显示:
Kind: text
- Terminal -I 输出:
text/plain; charset=utf-16le
我猜文件的 utf-16le 编码是关键,因为我期待 NSUTF8 文件。 我试图使用 ASCII 作为最低公分母。它没有崩溃,但在原始文件中不存在的一些字符被篡改了。
NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&errorReading];
所以我尝试先将文件转换为 NSData,希望它可以消除识别编码的需要。没用。
NSData *txtFileData = [NSData dataWithContentsOfFile:path];
NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSUTF8StringEncoding];
这让我想到了几个问题:
- 是否没有一种通用的方法可以将纯文本文件内容(无论编码如何)转换为字符串(即最小公分母)?我相信这曾经是
initWithContentsOfFile
的目的,不幸的是现在已经弃用了。 ASCIStringEncoding 无效。 - 关于将 NSUTF16 编码文件转换为字符串,我需要以不同于 NSUTF8 的方式处理吗?
假设文件实际上是 URF16LE,为什么下面的 suggestion 也不起作用?
NSString *txtFileAsString = nil; if (path !=nil) { NSData *txtFileData = [NSData dataWithContentsOfFile:path]; NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSASCIIStringEncoding]; if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF8StringEncoding]; } if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16StringEncoding]; } if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16LittleEndianStringEncoding]; } if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16BigEndianStringEncoding]; } if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32StringEncoding]; } if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32LittleEndianStringEncoding]; } if (!txtFileAsString) { txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32BigEndianStringEncoding]; }}
有时 stringWithContentsOfFile:usedEncoding:error:
可以完成这项工作(特别是如果文件有 Byte Order Mark):
NSError *error;
NSStringEncoding encoding;
NSString *string = [NSString stringWithContentsOfFile:path usedEncoding:&encoding error:&error];
请注意,此带有 usedEncoding
的再现不应与仅具有 encoding
参数的类似命名方法混淆。