Swift 4+:使用NSPasteboard复制字符串异常问题
解决Swift 4+中剪贴板文本被转为URL编码的问题
我之前也踩过这个坑!问题核心出在剪贴板的内容类型指定上——Swift 4之后,系统对剪贴板的类型判定更严格了,如果没有明确告诉系统这是纯文本,很容易被误判为URL格式,导致空格这类字符被转成%20的编码形式。
为什么会出现这个问题?
你大概率是两种情况:要么直接用了默认的string属性设置剪贴板(系统可能自动推断类型出错),要么错误地指定了URL相关的类型(比如你尝试过的kUTTypeFileURL),这会强制让系统把文本当作URL来编码处理。
正确的实现代码
根据你使用的平台(iOS/UIKit 或 macOS/AppKit),分别用下面的代码:
iOS(UIKit)
import UIKit import MobileCoreServices // 需导入这个才能使用kUTTypePlainText let pasteboard = UIPasteboard.general // 明确指定内容为纯文本类型 pasteboard.setValue("This is my sample text", forPasteboardType: kUTTypePlainText as String) // 如果你用的是iOS 14+/macOS 11+,更推荐用新的UTType API import UniformTypeIdentifiers pasteboard.setValue("This is my sample text", forPasteboardType: UTType.plainText.identifier)
macOS(AppKit)
import AppKit import CoreServices // 需导入这个才能使用kUTTypePlainText let pasteboard = NSPasteboard.general pasteboard.clearContents() // macOS下建议先清空剪贴板再添加内容 pasteboard.setString("This is my sample text", forType: .string) // 新UTType API写法 import UniformTypeIdentifiers pasteboard.clearContents() pasteboard.setString("This is my sample text", forType: UTType.plainText)
要避开的错误写法
- 不要用
kUTTypeURL或kUTTypeFileURL来设置纯文本,这会强制触发URL编码 - 不要只依赖
pasteboard.string = "xxx"——当文本里包含网址片段时,系统可能自动推断类型为URL,明确指定类型更可靠
测试一下上面的代码,复制的文本应该就能保持原始格式,不会再出现%20了!
内容的提问来源于stack exchange,提问作者kiddslopp
相关产品推荐
相关产品推荐

