Как обнаружить кодирование в данных на основе строки? - PullRequest
1 голос
/ 21 января 2020

Я загружаю текстовый файл , кодировка неизвестна, так как она поступает из других источников. Само содержимое исходит из метода macos NSDocument 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 = "?????"
        }
    }

1 Ответ

1 голос
/ 21 января 2020

Вы можете расширить 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)
}
...