我遇到了一个奇怪的问题。每当我在iOS应用程序中创建新文本文件时,我将其编码设置为NSUTF8StringEncoding
。如果我编辑文件并输入任何带有变音符号的字符并保存更改,则变音符号会在某些应用程序(如BBEdit,TextMate,cat和vi)中正确呈现,但在其他应用程序(如TextEdit,Quick Look和Pages)中则无法呈现。
我正在使用以下代码将UITextView的内容保存到普通的txt文件中。
NSError *error;
NSString *dataString = self.textView.text;
BOOL savedChanges = [dataString writeToFile:fullPath atomically:YES encoding:NSUTF8Encoding error:&error];
if (!savedChanges)
{
// Pop up an alert saying something went wrong.
}
unix file
命令报告保存的文件确实是“UTF-8 Unicode文本,没有行终止符”
甚至更奇怪的是,如果我在不更改文本内容的情况下再次保存文件,则文件将在Quick Look& Mac上的TextEdit。
任何帮助都将不胜感激。
答案 0 :(得分:1)
这是一个猜测,但它可能与缺少byte order mark有关吗?对于UTF8,BOM看起来像十六进制的EF BB BF
,应该是文件中的第一件事。
答案 1 :(得分:1)
如果使用UTF BOM保存文本文件,并且未设置com.apple.TextEncoding
xattr,则打开它的任何软件都必须猜测正确的字符编码。一些应用程序猜测UTF-8,有些人猜测Mac OS Roman,还有其他猜测其他东西。
您可以通过将文件保存为没有BOM的UTF-8来复制此行为,然后在终端中提供xattr -d com.apple.TextEncoding filename.txt
命令。
要设置xattr,您可以调用setxattr()。似乎没有记录的方法通过Cocoa API设置它。您还可以使用UTF-8 BOM为数据添加前缀。
当BOM和xattr丢失时,应该假设什么字符编码。如果默认为Mac OS Roman,这是一个错误吗? UTF-8应该是默认值吗?
答案 2 :(得分:0)
如果您想避免使用BOM,另一种方法是将文件上的com.apple.TextEncoding
扩展属性设置为UTF-8;134217984
- See here for more details。
我不知道你会如何从代码中做到这一点,但是xattr -w com.apple.TextEncoding 'UTF-8;134217984' filename.txt
会在命令行执行此操作以确认它为您解决了问题。
答案 3 :(得分:0)
我昨天遇到了同样的问题! My problem是由NSString
writeToFile:atomically:encoding:error:
创建的文件由QuickLook和文本编辑完美读取和解释,但是通过将UTF-8数据直接写入{{1在QL& TE(自动编码错了)。
Peter Hosey向我指出了这个问题,经过一些测试后发现NSFileHandle
方法不使用BOM,而只使用扩展属性NSString
。通过我在网上找到的一些代码,我创建了一个com.apple.TextEncoding
类别,允许您通过传递文件路径和NSString
值来轻松设置此值。
NSString (FileTextEncodingAttribute) on gist.github
一个例子是:
NSStringEncoding
我已经对此进行了测试,它运行得很完美:)谁知道写一个纯文本文件会花费这么多研究!!