Search code examples
swiftswift5

Trying to concatenate a string with what I think is an unicode suffix


I have this app of mine that reads datamatrix barcodes from drugs using the camera.

When it does for a particular drug, I receive this string from the detector, as seen on Xcode console:

0100000000D272671721123110700XXXX\U0000001d91D1

my problem is that \U0000001d91D1 part.

This code can be decomposed on the following:

01 00000000D27267 17 211231 10 700XXXX \U0000001d 91D1"

01 = drug code
17 = expiring date DMY
10 = batch number
The last part is the dosage rate

Now on another part of the application I am on the simulator, with no camera, so I need to pass this string to the module that decomposes the code.

I have tried to store the code as a string using

let code = "0100000000D272671721123110700XXXX\U0000001d91D1"

it complains about the inverted bar, so I change it to double bar

let code = "0100000000D272671721123110700XXXX\\U0000001d91D1"

the detector analyzes this string and concludes that the batch number is 700XXXX\U0000001d91D1, instead of just 700XXXX, so the information contained from the \ forward is lost.

I think this is unicode or something.

How do I create this string correctly.


Solution

  • You can use string transform to decode your hex unicode characters:

    let str1 = #"0100000000D272671721123110700XXXX\U00000DF491D1"#
    let str2 = #"0100000000D272671721123110700XXXX\U0000001d91D1"#
    let decoded1 = str1.applyingTransform(.init("Hex-Any"), reverse: false)!  // "0100000000D272671721123110700XXXX෴91D1"
    let decoded2 = str2.applyingTransform(.init("Hex-Any"), reverse: false)!  // "0100000000D272671721123110700XXXX91D1"
    

    You can also get rid of the verbosity extending StringTransform and StringProtocol:

    extension StringTransform {
        static let hexToAny: Self = .init("Hex-Any")
        static let anyToHex: Self = .init("Any-Hex")
    }
    

    extension StringProtocol {
        var decodingHex: String {
            applyingTransform(.hexToAny, reverse: false)!
        }
        var encodingHex: String {
            applyingTransform(.anyToHex, reverse: false)!
        }
    }
    

    Usage:

    let str1 = #"0100000000D272671721123110700XXXX\U00000DF491D1"#
    let str2 = #"0100000000D272671721123110700XXXX\U0000001d91D1"#
    let decoded1 = str1.decodingHex  // "0100000000D272671721123110700XXXX෴91D1"
    let decoded2 = str2.decodingHex // "0100000000D272671721123110700XXXX91D1"