Конвертировать 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
Другие вопросы по тегам