【问题标题】:Convert array of unicode code points to string将 unicode 代码点数组转换为字符串
【发布时间】:2019-06-13 17:05:08
【问题描述】:

给定一个表示 unicode 代码点的字符串数组:

let arr : [String] = ["0023", "FE0F", "20E3"]

如何将其动态转换为 swift 字符串?静态地,我发现我可以写:

let str = "\u{0023}\u{FE0F}\u{20E3}"

但是,我想动态地执行此操作,因为每个数组将代表一些代码点序列。在上面的例子中,输出将是#️⃣

【问题讨论】:

标签: arrays swift string unicode


【解决方案1】:

您可以将每个十六进制字符串转换为UInt32,为每个元素初始化一个Unicode.Scalar,并从中创建一个StringUnicodeScalarView

let arr = ["0023", "FE0F", "20E3"]
let values = arr.compactMap{ UInt32($0, radix: 16) }
let unicodeScalars = values.compactMap(Unicode.Scalar.init)
let string = String(String.UnicodeScalarView(unicodeScalars))

也可以写成单行:

let arr = ["0023", "FE0F", "20E3"]
let string = String(String.UnicodeScalarView(arr.compactMap{ UInt32($0, radix: 16) }.compactMap(Unicode.Scalar.init)))

编辑/更新:

如果您的所有字符串都可以用 UInt16 值表示,您还可以使用字符串初始化器 init(utf16CodeUnits: UnsafePointer<unichar>, count: Int),如 @MartinR here 所示:

let arr = ["0023", "FE0F", "20E3"]
let values = arr.compactMap { UInt16($0, radix: 16) }
let string = String(utf16CodeUnits: values, count: values.count)  // "#️⃣"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多