将 NSAttributedString 转换为纯文本

问题描述 投票:0回答:5

我有一个

NSData
的实例,其中包含源自
NSAttributedString
的属性文本 (
NSTextView
)。我想将属性字符串转换为纯字符串 (
NSString
),无需任何格式来进行一些文本分析(在转换时,我无法访问原始 NSTextView 或其 NSTextStorage 实例)。

最好的方法是什么?

编辑:

出于好奇,我检查了以下结果:

[[[self textView] textStorage] words]

这对于进行一些文本分析来说似乎很方便。生成的数组包含 NSSubTextStorage 的实例(下面是单词“Eastern”的示例):

东方{ NSFont = "\"LucidaGrande 11.00 pt. P [] (0x7ffcaae08330) fobj=0x10a8472d0, spc=3.48\""; NSParagraphStyle = "对齐方式 0,行间距 0,段落间距 0,段落间距之前 0,头缩进 0,尾缩进 0, FirstLineHeadIndent 0、LineHeight 0/0、LineHeightMultiple 0、 换行模式 0,制表符 ( 28升, 56升, 84升, 112升,
140升, 168升, 196升, 224升, 252升, 280升,
308升, 336L )、DefaultTabInterval 0、块(空)、列表(空)、 BaseWritingDirection -1,HyphenationFactor 0,TighteningFactor 0.05, 标题级别 0"; }

NSSubTextStorage 可能是一个私有类,因为我找不到它的任何文档。它还保留所有格式。

cocoa nsattributedstring
5个回答
70
投票

如果我理解正确的话,你有一个

NSData
,比如说
data
,包含一个编码的
NSAttributedString
。要反转该过程:

NSAttributedString *nas = [[NSAttributedString alloc] initWithData:data
                                                           options:nil
                                                documentAttributes:NULL
                                                             error:NULL];

并获取没有属性的纯文本,然后执行以下操作:

NSString *str = [nas string];

32
投票

更新 Swift 5:

attributedText.string

4
投票

在 Swift 5 和 macOS 10.0+ 中,

NSAttributedString
有一个名为
string
的属性。
string
有以下声明:

var string: String { get }

接收者的字符内容作为

NSString
对象。

Apple 还声明了

string

附件字符不会从此属性的值中删除。 [...]


以下 Playground 代码展示了如何使用

NSAttributedString
string
属性来检索
NSAttributedString
实例的字符串内容:

import Cocoa

let string = "Some text"
let attributes = [NSAttributedString.Key.underlineStyle : NSUnderlineStyle.single]
let attributedString = NSAttributedString(string: string, attributes: attributes)

/* later */

let newString = attributedString.string
print(newString) // prints: "Some text"
print(type(of: newString)) // prints: String

3
投票

从 Swift 5.7(或更早版本)开始,新的 AttributedString 结构不再具有

string
属性。下面的代码可以工作,即使看起来很傻。

part.characters.map { String($0) }.joined(separator: "")

0
投票

稍微扩展一下@Juguang的答案:

extension AttributedString {
    func toString() -> String {
        return self.characters.map { String($0) }.joined(separator: "")
    }
}

用途:

print("Working value = \(workingAttribStrng.toString())")

当前的 Swift(截至 2024 年 12 月,Xcode 16.1,Swift 5.10)不会接受早期的答案,但这似乎工作正常,并且此线程是搜索“Swift AttributedString to plaintext”时首先出现的内容。

© www.soinside.com 2019 - 2024. All rights reserved.