将 UInt32 (UTF-32) 转换为 Swift 中的字符串
Convert UInt32 (UTF-32) to String in Swift
我有一个 UInt32 值数组。我想将此数组转换为 String
.
这行不通:
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049]
let myString = String(myUInt32Array) // error
let myString = String(stringInterpolationSegment: myUInt32Array) // [72, 101, 108, 108, 111, 128049] (not what I want)
这些 SO 帖子显示 UTF8
和 UTF16
:
- How can I create a String from UTF8 in Swift?
- Is there a way to create a String from utf16 array in swift?
UnicodeScalar
是 UInt32
的类型别名。因此,将您的 UInt32
值转换为 UnicodeScalar
,然后将它们附加到 String
.
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049]
var myString: String = ""
for value in myUInt32Array {
if let scalar = UnicodeScalar(value) {
myString.append(Character(scalar))
}
}
print(myString) // Hello
(答案已更新 Swift 4 及更高版本。)
使用 Swift 类型 Data
和 String
这可以像
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let data = Data(bytes: myUInt32Array, count: myUInt32Array.count * MemoryLayout<UInt32>.stride)
let myString = String(data: data, encoding: .utf32LittleEndian)!
print(myString) // Hello
此处使用强制解包,因为从 UTF-32 转换而来
指向字符串的代码不能失败。
为了方便起见,您可以定义一个 String
扩展名
extension String {
init(utf32chars:[UInt32]) {
let data = Data(bytes: utf32chars, count: utf32chars.count * MemoryLayout<UInt32>.stride)
self = String(data: data, encoding: .utf32LittleEndian)!
}
}
并将其用作
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let myString = String(utf32chars: myUInt32Array)
print(myString) // Hello
为了完整起见,通用转换器
来自
extension String {
init?<C : UnicodeCodec>(codeUnits:[C.CodeUnit], codec : C) {
var codec = codec
var str = ""
var generator = codeUnits.makeIterator()
var done = false
while !done {
let r = codec.decode(&generator)
switch (r) {
case .emptyInput:
done = true
case .scalarValue(let val):
str.unicodeScalars.append(val)
case .error:
return nil
}
}
self = str
}
}
可用于 UTF-8、UTF-16 和 UTF-32 输入。在你的情况下它将是
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let myString = String(codeUnits: myUInt32Array, codec : UTF32())!
print(myString) // Hello
我有一个 UInt32 值数组。我想将此数组转换为 String
.
这行不通:
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049]
let myString = String(myUInt32Array) // error
let myString = String(stringInterpolationSegment: myUInt32Array) // [72, 101, 108, 108, 111, 128049] (not what I want)
这些 SO 帖子显示 UTF8
和 UTF16
:
- How can I create a String from UTF8 in Swift?
- Is there a way to create a String from utf16 array in swift?
UnicodeScalar
是 UInt32
的类型别名。因此,将您的 UInt32
值转换为 UnicodeScalar
,然后将它们附加到 String
.
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049]
var myString: String = ""
for value in myUInt32Array {
if let scalar = UnicodeScalar(value) {
myString.append(Character(scalar))
}
}
print(myString) // Hello
(答案已更新 Swift 4 及更高版本。)
使用 Swift 类型 Data
和 String
这可以像
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let data = Data(bytes: myUInt32Array, count: myUInt32Array.count * MemoryLayout<UInt32>.stride)
let myString = String(data: data, encoding: .utf32LittleEndian)!
print(myString) // Hello
此处使用强制解包,因为从 UTF-32 转换而来 指向字符串的代码不能失败。
为了方便起见,您可以定义一个 String
扩展名
extension String {
init(utf32chars:[UInt32]) {
let data = Data(bytes: utf32chars, count: utf32chars.count * MemoryLayout<UInt32>.stride)
self = String(data: data, encoding: .utf32LittleEndian)!
}
}
并将其用作
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let myString = String(utf32chars: myUInt32Array)
print(myString) // Hello
为了完整起见,通用转换器 来自
extension String {
init?<C : UnicodeCodec>(codeUnits:[C.CodeUnit], codec : C) {
var codec = codec
var str = ""
var generator = codeUnits.makeIterator()
var done = false
while !done {
let r = codec.decode(&generator)
switch (r) {
case .emptyInput:
done = true
case .scalarValue(let val):
str.unicodeScalars.append(val)
case .error:
return nil
}
}
self = str
}
}
可用于 UTF-8、UTF-16 和 UTF-32 输入。在你的情况下它将是
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let myString = String(codeUnits: myUInt32Array, codec : UTF32())!
print(myString) // Hello