(在进一步研究之后,该问题已从NSTextView问题改写而来)

更新:您可以下载一个非常基本的项目,在此处显示问题:

http://w3style.co.uk/~d11wtq/DocumentApp.tar.gz

(在保存的文件上执行grep -c "\r" file.txt以获得\r出现的行数...对\n重复)。

我已经意识到,由NSDocument创建的所有文件都具有\r是行尾,而不是标准的\n,即使我的文档子类返回的NSData不包含\r,也仅包含\n。有没有一种配置方式?

我认为这些天Mac使用UNIX行结尾,因此AppKit仍在使用陈旧的Mac结尾似乎很奇怪。怪异的是,NSDocument要求输入NSData,然后通过转换行尾而无礼地破坏了NSData

生成\r之后会切换到NSData,因此NSDocument本身正在对字节进行一些替换:

 const char *bytes = [data bytes];
 int i, len;
 for (i = 0, len = [data length]; i < len; ++i) {
  NSLog(@"byte %d = %02x", i, bytes[i]);
 }


输出(注释0a是\n的十六进制值):

> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 0 = 66
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 1 = 6f
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 2 = 6f
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 3 = 0a
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 4 = 62
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 5 = 61
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 6 = 72
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 7 = 0a


如果NSDocument要求提供NSData,则应遵守该规定,而不要对其进行修改。

这是方法中的完整代码:我文档中的-dataOfType:error:方法:

    -(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
 NSString *string = [textView string];

 // DEBUG CODE...
 NSArray *unixLines = [string componentsSeparatedByString:@"\n"];
 NSArray *windowsLines = [string componentsSeparatedByString:@"\r\n"];
 NSArray *macLines = [string componentsSeparatedByString:@"\r"];

 NSLog(@"TextView has %d LF, %d CRLF, %d CR", [unixLines count] - 1, [windowsLines count] - 1, [macLines count] - 1);

 NSData *data = [NSData dataWithBytes:[string cStringUsingEncoding:NSUTF8StringEncoding]
          length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

 const char *bytes = [data bytes];
 int i, len;
 for (i = 0, len = [data length]; i < len; ++i) {
  NSLog(@"byte %d = %02x", i, bytes[i]);
 }

 if (data != nil) {
  [textView breakUndoCoalescing];
 }

 return data;
}

最佳答案

NSDocument不在乎行终止;这是半抽象类,旨在进行子类化。它本身不对文件格式强加任何内容。

这是NSDocument子类的特殊实现-恰好读写纯文本-会关心行终止符。

10-04 18:38