试图连接一个字符串与我认为是一个unicode后缀



我有一个应用程序,使用相机读取药物的数据矩阵条形码。

当它对一个特定的药物,我收到这个字符串从检测器,如在Xcode控制台看到的:

0100000000D272671721123110700XXXXU0000001d91D1

我的问题是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 = "0100000000D272671721123110700XXXXU0000001d91D1"

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

let code = "0100000000D272671721123110700XXXX\U0000001d91D1"

检测器分析该字符串,得出批号是700XXXXU0000001d91D1,而不是700XXXX,因此以后包含的信息丢失了。

我想这是unicode之类的。

如何正确创建这个字符串

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

let str1 = #"0100000000D272671721123110700XXXXU00000DF491D1"#
let str2 = #"0100000000D272671721123110700XXXXU0000001d91D1"#
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 = #"0100000000D272671721123110700XXXXU00000DF491D1"#
let str2 = #"0100000000D272671721123110700XXXXU0000001d91D1"#
let decoded1 = str1.decodingHex  // "0100000000D272671721123110700XXXX෴91D1"
let decoded2 = str2.decodingHex // "0100000000D272671721123110700XXXX91D1"

U0000001d子字符串可能表示代码点U+001D INFORMATION SEPARATOR THREE,这也是ASCII码点GS(组分隔符)。

在Swift字符串字面值中,我们可以使用Unicode转义序列:u{1d}来编写该代码点。试着这样写你的字符串字面值:

let code = "0100000000D272671721123110700XXXXu{1d}91D1"

相关内容

最新更新