【问题标题】:How to detect encoding in Data based on a String?如何根据字符串检测数据中的编码?
【发布时间】:2020-01-21 00:39:26
【问题描述】:

我正在加载一个文本文件,编码未知,因为它来自其他来源。内容本身来自 macOS NSDocument 的 read 方法,该方法被输入到我的模型的读取中。 String 构造函数 requires the encoding when using Data,如果你假设不正确,你可能得到一个 null。我已经创建了潜在编码的条件级联(这就是other people seem to be doing),必须有更好的方法来做到这一点。有什么建议吗?

    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 = "?????"
        }
    }

【问题讨论】:

  • 如果您的文字来自网络,您可以查看此帖子stackoverflow.com/a/34687962/2303865
  • 感谢@LeoDabus 的建议,不幸的是它不是来自网络。它是文件系统上的常规文本文件,因此是 NSDocument。
  • NSString上有一个静态方法可以猜测编码
  • @LeoDabus 除非我遗漏了什么,否则 NSString 还需要指定编码。您是否有指向特定工厂或构造方法的文档的链接?

标签: swift string nsdata


【解决方案1】:

您可以扩展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)
}

【讨论】:

  • 我选择了这个答案作为正确的答案,因为根据文档,这是正确的方法,但不知何故总是以不正确的编码返回。因此,这个问题可能是 Apple 实施中的一个错误。
猜你喜欢
  • 2013-04-01
  • 2016-06-05
  • 2015-03-31
  • 1970-01-01
  • 2019-10-24
  • 2015-05-08
  • 2023-03-31
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多