使用writeToFile时的不同编码结果:atomically:encoding:error:vs. createFileAtPath:contents:attributes:

时间:2010-10-19 05:35:20

标签: iphone objective-c cocoa encoding

在我的iPhone应用程序中,我可以将数据导出到.txt文件并通过Mail发送 - 但目前在编码方面存在问题。

要将文件附加到邮件,我只需从NSString实例创建一个NSData实例,如下所示:

NSData *dataToExport = [[NSData alloc] initWithData:[myExportString dataUsingEncoding:NSUTF8StringEncoding]];
[[NSFileManager defaultManager] createFileAtPath:pathToExportFile contents:dataToExport attributes:nil];

但最终导致文件内容与此类似(编码错误):

√úberraschung

改为使用

[myExportString writeToFile:pathToExportFile atomically:NO encoding:NSUTF8StringEncoding error:&error];

...使用正确的enconding创建一个文件:

Überraschung

任何想法,我如何能够以第一种方式获得正确的编码?

谢谢你, 弗洛里安

2 个答案:

答案 0 :(得分:1)

NSString的writeToFile:atomically:encoding:error:方法在输出文件上设置标识编码的扩展属性。 TextEdit检查此属性并在其存在时使用该编码。

由于您没有(并且不能)告诉NSFileManager的方法使用什么编码(因为它是用于普通数据,不一定是文本编码为数据),因此它不会设置此属性。如果没有它,TextEdit会猜测,而且它的确如此糟糕。

我不知道MobileMail是否会以某种方式保留扩展属性。尝试两种方式,当您收到消息时,检查其原始内容并查看其中一个是否指定了文件的编码。无论如何,你的十六进制转储证明文本正确编码。

更一般地说,当您想要将文本写入文件时,NSString的方法是正确的解决方案。

答案 1 :(得分:0)

这很奇怪。这是hexdump -C输出。

“错误”编码:

00000000  c3 9c 62 65 72 72 61 73  63 68 75 6e 67           |..berraschung| 
0000000d

“正确”编码:

00000000  c3 9c 62 65 72 72 61 73  63 68 75 6e 67           |..berraschung|
0000000d

我也在尝试不同的应用程序来查看文档:

  • TextEdit:错误
  • Excel:错误
  • SubEthaEdit:right
  • 数字:对

非常奇怪,对吧?