From 89ae9bd3492e90c805a0c0bb9c58c3f8a0d73660 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 18 Mar 2015 13:05:39 -0400 Subject: [PATCH] handle utf8 in polling better --- SwiftIO/SocketEngine.swift | 10 +++-- SwiftIO/SocketFixUTF8.swift | 79 ++++--------------------------------- 2 files changed, 15 insertions(+), 74 deletions(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 33af2fb..fb1e989 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -406,7 +406,9 @@ public class SocketEngine: NSObject, WebSocketDelegate { private func parseEngineMessage(var message:String) { // NSLog("Engine got message: \(message)") - fixDoubleUTF8(&message) + if self.polling { + fixDoubleUTF8(&message) + } // We should upgrade if message == "3probe" { @@ -500,9 +502,11 @@ public class SocketEngine: NSObject, WebSocketDelegate { } } - private func sendPollMessage(msg:String, withType type:PacketType, + private func sendPollMessage(var msg:String, withType type:PacketType, datas:[NSData]? = nil) { // println("Sending poll: \(msg) as type: \(type.rawValue)") + + doubleEncodeUTF8(&msg) let strMsg = "\(type.rawValue)\(msg)" self.postWait.append(strMsg) @@ -584,4 +588,4 @@ public class SocketEngine: NSObject, WebSocketDelegate { public func websocketDidReceiveData(socket:WebSocket, data:NSData) { self.parseEngineData(data) } -} +} \ No newline at end of file diff --git a/SwiftIO/SocketFixUTF8.swift b/SwiftIO/SocketFixUTF8.swift index 0d10fcc..032509a 100644 --- a/SwiftIO/SocketFixUTF8.swift +++ b/SwiftIO/SocketFixUTF8.swift @@ -21,80 +21,17 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // -// Adapted from: https://github.com/durbrow/fix-double-utf8.swift import Foundation -var memoizer = [String: UnicodeScalar]() - -func lookup(base:UnicodeScalar, combi:UnicodeScalar) -> UnicodeScalar { - let combined = "\(base)\(combi)" - - if let y = memoizer[combined] { - return y - } - - for i in 0x80...0xFF { - let ch = UnicodeScalar(i) - - if String(ch) == combined { - memoizer[combined] = ch - return ch - } - } - let ch = UnicodeScalar(0xFFFD) // Unicode replacement character � - - memoizer[combined] = ch - return ch +func fixDoubleUTF8(inout name:String) { + let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)! + let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)! + name = latin1 as String } -func fixDoubleUTF8(inout name:String) { - var isASCII = true - var y = [UInt8]() - - for ch in name.unicodeScalars { - if ch.value < 0x80 { - y.append(UInt8(ch)) - continue - } - isASCII = false - - if ch.value < 0x100 { - y.append(UInt8(ch)) - continue - } - // might be a combining character that when combined with the - // preceeding character maps to a codepoint in the UTF8 range - if y.count == 0 { - return - } - - let last = y.removeLast() - let repl = lookup(UnicodeScalar(last), ch) - - // the replacement needs to be in the UTF8 range - if repl.value >= 0x100 { - return - } - - y.append(UInt8(repl)) - } - - if isASCII { - return - } - - y.append(0) // null terminator - - return y.withUnsafeBufferPointer { - let cstr = UnsafePointer($0.baseAddress) // typecase from uint8_t * to char * - let rslt = String.fromCStringRepairingIllFormedUTF8(cstr) // -> (String, Bool) - if let str = rslt.0 { - if !rslt.hadError { - name = str - } - } - - return - } +func doubleEncodeUTF8(inout str:String) { + let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)! + let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)! + str = utf8 as String } \ No newline at end of file