【问题标题】:Trying to concatenate a string with what I think is an unicode suffix尝试将字符串与我认为是 unicode 后缀的字符串连接起来
【发布时间】:2021-08-13 16:06:35
【问题描述】:

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

当它检测特定药物时,我会从检测器收到这个字符串,如 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 什么的。

如何正确创建此字符串。

【问题讨论】:

  • 是否需要`\`后面的最后一部分?
  • 是的............
  • 我仍然不确定您到底在寻找什么(也许给出输入和输出的例子)
  • 解码器从摄像头0100000000D272671721123110700XXXX\U0000001d91D1接收到这个。现在我正在尝试使用变量向解码器发送相同的字符串,而不使用相机。
  • "得出的结论是批号是700XXXX\U0000001d91D1,而不仅仅是700XXXX"你的意思是相反吗?

标签: swift swift5


【解决方案1】:

您可以使用字符串转换来解码您的十六进制 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"

【讨论】:

  • 简直太棒了!不能给你足够的支持。 str1.applyingTransform 为我做了诀窍。你能解释一下applyingTransform在做什么吗? Apple 不想在他们糟糕的文档中解释该 API。谢谢
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2021-04-26
    • 1970-01-01
    • 2013-06-09
    • 2017-04-29
    相关资源
    最近更新 更多