diff options
| author | Dustin Mierau <dustin@mierau.me> | 2023-12-08 16:12:47 -0800 |
|---|---|---|
| committer | Dustin Mierau <dustin@mierau.me> | 2023-12-08 16:13:03 -0800 |
| commit | 84aaa9ef0a1be6986e38d7e4f58e07d3cb84979e (patch) | |
| tree | c0b3a36f14295a921413b7db0f1b37c9ec10e715 /Hotline/Utility/FoundationExtensions.swift | |
| parent | 537ed932a4c8d639089f276e322de4e946b0d26b (diff) | |
Move tracker client to async/await. TrackerView uses Model now. Fix string encodings for MacRoman and japanese.
Diffstat (limited to 'Hotline/Utility/FoundationExtensions.swift')
| -rw-r--r-- | Hotline/Utility/FoundationExtensions.swift | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/Hotline/Utility/FoundationExtensions.swift b/Hotline/Utility/FoundationExtensions.swift index 000314e..719df40 100644 --- a/Hotline/Utility/FoundationExtensions.swift +++ b/Hotline/Utility/FoundationExtensions.swift @@ -5,6 +5,24 @@ enum Endianness { case little } +func detectStringEncoding(of data: Data) -> String.Encoding { +// var nsString: NSString? = nil +// guard case let rawValue = NSString.stringEncoding(for: data, encodingOptions: [.allowLossyKey: false], convertedString: nil, usedLossyConversion: nil) else { +// print("NO ENCODING") +// return nil +// } + + let rawValue = NSString.stringEncoding(for: data, encodingOptions: [.allowLossyKey: false], convertedString: nil, usedLossyConversion: nil) + +// let cfEnc: CFStringEncoding = CFStringConvertNSStringEncodingToEncoding(rawValue); + +// let encodingString: CFString? = CFStringGetNameOfEncoding(cfEnc) + + print("DETECTED ENCODING \(rawValue)") + + return String.Encoding(rawValue: rawValue) +} + extension Data { init(_ val: UInt8) { self.init() @@ -50,16 +68,37 @@ extension Data { } return self.subdata(in: offset..<(offset + length)) } - + func readString(at offset: Int, length: Int) -> String? { - var str: String? + let subdata = self[offset..<(offset + length)] + if subdata.count == 0 { + return "" + } + + let allowedEncodings = [ + NSUTF8StringEncoding, + NSShiftJISStringEncoding, + NSUnicodeStringEncoding, + NSWindowsCP1251StringEncoding + ] + + var decodedNSString: NSString? + let rawValue = NSString.stringEncoding(for: subdata, encodingOptions: [.allowLossyKey: false], convertedString: &decodedNSString, usedLossyConversion: nil) + + if allowedEncodings.contains(rawValue) { + return decodedNSString as? String + } + + else if rawValue > 1 { + print("ENCODING FOUND \(rawValue)") + } - str = String(data: self[offset..<(offset + length)], encoding: .utf8) - if str == nil { - str = String(data: self[offset..<(offset + length)], encoding: .ascii) + var macStr = String(data: subdata, encoding: .macOSRoman) + if macStr == nil { + macStr = String(data: subdata, encoding: .nonLossyASCII) } - return str + return macStr } func readPString(at offset: Int) -> (String?, Int) { |