- f cv rest | (cv < 0x20 || cv > 0x7e || cv == 0x22 || cv == 0x27 || cv == 0x5c) =
- '\\':'u':h3:h2:h1:h0:rest
- where (q3,r3) = quotRem cv (16*16*16)
- h3 = toUpper(intToDigit q3)
- (q2,r2) = quotRem r3 (16*16)
- h2 = toUpper(intToDigit q2)
- (q1,r1) = quotRem r2 16
- h1 = toUpper(intToDigit q1)
- h0 = toUpper(intToDigit r1)
+ f cv rest
+ | cv > 0xFF = '\\':'x':hs ++ rest
+ | (cv < 0x20 || cv > 0x7e || cv == 0x22 || cv == 0x27 || cv == 0x5c) =
+ '\\':'x':h1:h0:rest
+ where (q1,r1) = quotRem cv 16
+ h1 = intToDigit q1
+ h0 = intToDigit r1
+ hs = dropWhile (=='0') $ reverse $ mkHex cv
+ mkHex 0 = ""
+ mkHex cv = intToDigit r : mkHex q
+ where (q,r) = quotRem cv 16