尝试将字符串与我认为的 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"
您还可以摆脱扩展 StringTransform
和 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)!
}
}
用法:
let str1 = #"0100000000D272671721123110700XXXX\U00000DF491D1"#
let str2 = #"0100000000D272671721123110700XXXX\U0000001d91D1"#
let decoded1 = str1.decodingHex // "0100000000D272671721123110700XXXX෴91D1"
let decoded2 = str2.decodingHex // "0100000000D272671721123110700XXXX91D1"
我有这个应用程序可以使用相机从药物中读取数据矩阵条形码。
当它针对特定药物时,我从检测器收到此字符串,如 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"
您还可以摆脱扩展 StringTransform
和 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)!
}
}
用法:
let str1 = #"0100000000D272671721123110700XXXX\U00000DF491D1"#
let str2 = #"0100000000D272671721123110700XXXX\U0000001d91D1"#
let decoded1 = str1.decodingHex // "0100000000D272671721123110700XXXX෴91D1"
let decoded2 = str2.decodingHex // "0100000000D272671721123110700XXXX91D1"