Конвертировать UInt32 (UTF-32) в строку в 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)
Эти ТАК сообщения показывают UTF8
а также UTF16
:
2 ответа
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
Используя базовые классы NSData/NSString, это можно сделать как
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let data = NSData(bytes: myUInt32Array, length: myUInt32Array.count * sizeof(UInt32))
let myString = NSString(data: data, encoding: NSUTF32LittleEndianStringEncoding) as! String
println(myString) // Hello
Принудительное приведение as! String
используется здесь, потому что преобразование из кодовых точек UTF-32 в строку не может завершиться ошибкой.
Вы можете определить String
расширение для вашего удобства
extension String {
init(utf32chars:[UInt32]) {
let data = NSData(bytes: utf32chars, length: utf32chars.count * sizeof(UInt32))
self = NSString(data: data, encoding: NSUTF32LittleEndianStringEncoding) as! String
}
}
и использовать его как
let myUInt32Array: [UInt32] = [72, 101, 108, 108, 111, 128049, 127465, 127466]
let myString = String(utf32chars: myUInt32Array)
println(myString) // Hello
И просто для полноты, общий конвертер из /questions/27719914/est-li-sposob-sozdat-stroku-iz-massiva-utf16-v-swift/27719927#27719927
extension String {
init?<C : UnicodeCodecType>(codeUnits:[C.CodeUnit], var codec : C) {
var str = ""
var generator = codeUnits.generate()
var done = false
while !done {
let r = codec.decode(&generator)
switch (r) {
case .EmptyInput:
done = true
case let .Result(val):
str.append(Character(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())!
println(myString) // Hello