我正在加载一个文本文件,编码未知,因为它来自其他来源。内容本身来自 macOS NSDocument 的 read 方法,该方法被输入到我的模型的 read 中。 String构造函数在使用Data时需要编码,如果您假设不正确,您可能得到null。我创建了潜在编码的条件级联(这就是其他人似乎正在做的),必须有更好的方法来做到这一点。有建议吗?
override func read(from data: Data, ofType typeName: String) throws {
model.read(from: data, ofType: typeName)
}
在模型中:
func read(from data: Data, ofType typeName: String) {
if let text = String(data: data, encoding: .utf8) {
content = text
} else if let text = String(data: data, encoding: .macOSRoman) {
content = text
} else if let text = String(data: data, encoding: .ascii) {
content = text
} else {
content = "?????"
}
}
您可以扩展
Data
并创建 stringEncoding
属性来尝试检测字符串编码。尝试这样:
extension Data {
var stringEncoding: String.Encoding? {
var nsString: NSString?
guard case let rawValue = NSString.stringEncoding(for: self, encodingOptions: nil, convertedString: &nsString, usedLossyConversion: nil), rawValue != 0 else { return nil }
return .init(rawValue: rawValue)
}
}
然后您可以简单地将
data.stringEncoding
传递给字符串初始值:
if let string = String(data: data, encoding: data.stringEncoding) {
print(string)
}
这是我基于@Leo Dabus 的方法,在 Xcode14.3 上运行良好
var stringEncoding: String.Encoding {
var nsString: NSString?
let rawValue = NSString.stringEncoding(for: self, encodingOptions: nil, convertedString: &nsString, usedLossyConversion: nil)
return .init(rawValue: rawValue)
}