【问题标题】:Deferent result in Unicode to String in Swift将 Unicode 中的结果推迟到 Swift 中的字符串
【发布时间】:2021-03-01 12:15:06
【问题描述】:

我正在使用此向下代码将我的 String 值转换为 unicodeScalars,例如,如果我将 "A" 作为输入,我将得到65 作为输出,既然我知道 65A 的数量,那么我想给 65 来接收 A 再次,但它给了 e,我确信我将一些主题混合在一起并且还遗漏了一些东西,需要一些帮助来理解为什么这是不同的以及我该如何使用 "\u{?????}" 返回我的字符串,谢谢

let string: String = "A"
let UInt32Value: UInt32 = string.unicodeScalars[string.startIndex].value
print(UInt32Value) // 65


let newString = "\u{65}"
print(newString) // e

ps:我知道有使用 unicodescalar 来取回字符串的官方方法,但我对 "\u{?????}" 很感兴趣

【问题讨论】:

    标签: swift string unicodescalar


    【解决方案1】:

    尝试如下转换

    let ans =  String(UnicodeScalar(UInt8(65)))
    print(ans)
    

    我认为问题是,您正在转换 (A) 字符串 -> unicodescalar -> uint

    并且必须转换 (65) uint -> unicodescalar -> 字符串才能得到原始值

    【讨论】:

    • 是的,我知道,但正如我在问题中所问的那样,我想用“\u{?????}”来完成这项工作,你知道我们也可以怎么做吗? ?
    • UInt8 初始化器的使用毫无意义。 String(UnicodeScalar(65)) UInt8 符合 Expressible ByIntegerliteral 和 Swift 是一种类型推断语言。它会自动推断出非可选的 UInt8 初始化器
    【解决方案2】:

    \u{...} 转义序列使用十六进制:

    可以使用以下转义序列将特殊字符包含在单行和多行形式的字符串文字中:

    • [...]
    • Unicode 标量 (\u{n}),其中 n 是 1 到 8 位的十六进制数

    来自language reference

    所以你需要

    "\u{41}"
    

    【讨论】:

    • 是不是说我必须用一个可以处理十六进制的func将65转换为41?
    • @swiftPunk 只需在谷歌上搜索“65 to hex”。 Google 现在可以进行十六进制转换。
    • @swiftPunk 另请注意,这是一个字符串 literal,您不能做任何疯狂的事情,例如调用函数/引用 {} 括号中的变量。您只能在其中输入 1 到 8 个十六进制数字。
    • @swiftPunk 也就是说,如果 在运行时 有数字 65(例如存储在变量中),则不能使用 \u{...} 表示法。在这种情况下,您可以使用 Chandramohan 的答案。 \u{...} 仅适用于在编译时知道数字的情况。
    • 或使用字符串基数初始化器String(65, radix: 16) 和相反的方向Int("41", radix: 16) 或直接输入0x41
    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 2016-09-02
    • 2020-06-16
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2021-08-18
    相关资源
    最近更新 更多