如何根据字符串检测数据中的编码?

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

我正在加载一个文本文件,编码未知,因为它来自其他来源。内容本身来自 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 = "?????"
        }
    }
swift string nsdata
2个回答
8
投票

您可以扩展

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)
}

0
投票

这是我基于@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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.