Jon*_*kas 0 arrays string unicode swift
给定一个表示unicode代码点的字符串数组:
let arr : [String] = ["0023", "FE0F", "20E3"]
Run Code Online (Sandbox Code Playgroud)
如何将其动态转换为快捷字符串?静态地,我发现我可以写:
let str = "\u{0023}\u{FE0F}\u{20E3}"
Run Code Online (Sandbox Code Playgroud)
但是,我想动态地执行此操作,因为每个数组将代表一些代码点序列。在上面的示例中,输出为#??
您可以将每个六进制字符串转换为UInt32,Unicode.Scalar为每个元素初始化一个,然后String UnicodeScalarView从中创建一个:
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))
Run Code Online (Sandbox Code Playgroud)
也可以写成一个衬里:
let arr = ["0023", "FE0F", "20E3"]
let string = String(String.UnicodeScalarView(arr.compactMap{ UInt32($0, radix: 16) }.compactMap(Unicode.Scalar.init)))
Run Code Online (Sandbox Code Playgroud)
编辑/更新:
如果您的所有字符串可以通过UINT16值来表示你也可以使用字符串初始化init(utf16CodeUnits: UnsafePointer<unichar>, count: Int)如图@MartinR 这里:
let arr = ["0023", "FE0F", "20E3"]
let values = arr.compactMap { UInt16($0, radix: 16) }
let string = String(utf16CodeUnits: values, count: values.count) // "#??"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |