尝试将字符串与我认为的 unicode 后缀连接起来

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

我有这个应用程序可以使用相机从药物中读取数据矩阵条形码。

当它针对特定药物时,我从检测器收到此字符串,如 Xcode 控制台上所示:

0100000000D272671721123110700XXXX\U0000001d91D1

我的问题是 \U0000001d91D1 部分。

这段代码可以分解为:

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

现在在应用程序的另一部分我在模拟器上,没有摄像头,所以我需要将这个字符串传递给分解代码的模块。

我尝试使用

将代码存储为字符串
let code = "0100000000D272671721123110700XXXX\U0000001d91D1"

它抱怨倒条,所以我把它改成双条

let code = "0100000000D272671721123110700XXXX\U0000001d91D1"

检测器分析该字符串并得出结论,批号是 700XXXX\U0000001d91D1,而不仅仅是 700XXXX,因此 \ 转发中包含的信息丢失了。

我认为这是 unicode 之类的。

如何正确创建这个字符串。

\U0000001d子串大概代表代码点U+001D INFORMATION SEPARATOR THREE,也是ASCII代码点GS(组分隔符)。

在 Swift 字符串文字中,我们可以使用 Unicode 转义序列编写该代码点:\u{1d}。尝试像这样编写字符串文字:

let code = "0100000000D272671721123110700XXXX\u{1d}91D1"

您可以使用字符串转换来解码您的十六进制 unicode 字符:

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"

您还可以摆脱扩展 StringTransformStringProtocol 的冗长:

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)!
    }
}

用法:

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