首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift 2.1 [UInt8] --utf8-->字符串?

Swift 2.1 [UInt8] --utf8-->字符串?
EN

Stack Overflow用户
提问于 2015-12-04 09:44:25
回答 2查看 1.4K关注 0票数 2

我知道这样的问题在Stack Overflow和其他地方都存在。但它似乎也发生了很大的变化。

给定一个UInt8列表(基本上是一个快速字节数组),将其转换为快速String的最简单/惯用的方法是什么

我对不使用NSData/NSString的方法特别感兴趣,因为如果Santa将Swift带到Linux世界,毫无疑问它将没有NS库,我想知道如何在Swift中做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-04 12:03:40

代码语言:javascript
复制
let buffUInt8: Array<UInt8> = [97, 98, 115, 100, 114, 102, 103, 104, 0]

// you need Int8 array
let buffInt8 = buffUInt8.map{ Int8(bitPattern: $0)}
let str = String.fromCString(buffInt8) // "absdrfgh"

或者,您可以使用

代码语言:javascript
复制
String.fromCStringRepairingIllFormedUTF8(cs: UnsafePointer<CChar>) -> (String?, hadError: Bool)
票数 2
EN

Stack Overflow用户

发布于 2015-12-05 09:44:43

实际上,我最终需要为UInt8流这样做,并对utf8解码有多难感到好奇。它绝对不是单行代码,而是通过下面的直接实现:

代码语言:javascript
复制
import UIKit

let bytes:[UInt8] = [0xE2, 0x82, 0xEC, 0x00]

var g = bytes.generate()

extension String {
    init(var utf8stream:IndexingGenerator<[UInt8]>) {
        var result = ""
        var codepoint:UInt32 = 0
        while let byte = utf8stream.next() where byte != 0x00 {
            codepoint = UInt32(byte)
            var extraBytes = 0
            if byte & 0b11100000 == 0b11000000 {
                extraBytes = 1
                codepoint &= 0b00011111
            }
            else if byte & 0b11110000 == 0b11100000 {
                extraBytes = 2
                codepoint &= 0b00001111
            }
            else if byte & 0b11111000 == 0b11110000 {
                extraBytes = 3
                codepoint &= 0b00000111
            }
            else if byte & 0b11111100 == 0b11111000 {
                extraBytes = 4
                codepoint &= 0b00000011
            }
            else if byte & 0b11111110 == 0b11111100 {
                extraBytes = 5
                codepoint &= 0b00000001
            }
            for _ in 0..<extraBytes {
                if let additionalByte = utf8stream.next() {
                    codepoint <<= 6
                    codepoint |= UInt32(additionalByte & 0b00111111)
                }
            }
            result.append(UnicodeScalar(codepoint))
        }
        self = result
    }
}

String(utf8stream: g)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34079555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档