objective-c - 在 NSDocument 中设置行终止符字符串?

标签 objective-c cocoa newline nstextview

(经过进一步研究,这个问题已根据 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 子类的特定实现 - 一个恰好读取和写入纯文本的子类 - 将关心行终止字符。

关于objective-c - 在 NSDocument 中设置行终止符字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466877/

相关文章:

ios - 如何在 iOS 中发送和接收网络 MIDI 数据?

java - Java 中的正则表达式以零长度行开始并跨行继续

objective-c - 来自脚本语言(Lua、Ruby 等)的 Cocoa 桥是否需要 MacOS 上的编译部分才能工作?

ios - 角标(Badge)在右栏按钮项目上的稳定位置

ios - 这个 Undefined symbols for architecture arm64 错误是什么? iOS 代码

cocoa - 核心数据延迟加载问题

macos - 将 NSArrayController 绑定(bind)到 NSSearchField 并在 NSTableView 中查看结果

cocoa - NSTextView 不可编辑的文本区域?

python - 在 Google 应用引擎中打印新行

C++输出到文本文件时的换行符