在[UInt8]数组或数据中包含UTF8字符文字

时间:2017-01-29 15:45:09

标签: swift swift3

我想要类似的东西:

let a = ["v".utf8[0], 1, 2]

我最接近的是:

let a = [0x76, 1, 2]

"v".data(using: String.Encoding.utf8)! + [1, 2]

注意:[UInt8]Data是可接受的类型。

3 个答案:

答案 0 :(得分:3)

有一个特定的UInt8初始值设定项(在Swift 2.2 +中引入):

let a = [UInt8(ascii:"v"), 1 ,2]

答案 1 :(得分:3)

String的{​​{1}}未被UTF8View编入索引,而是自己的Int类型,因此为了包含UTF-8序列的第一个字节对于数组文字中的给定字符串,您可以使用其String.UTF8View.Index属性:

first

如果序列中有多个字节,只需使用let a = ["v".utf8.first!, 1, 2] // [118, 1, 2] 运算符即可将UTF-8字节与数组文字连接:

+

另请注意,将let a = "".utf8 + [1, 2] // [240, 159, 152, 128, 1, 2] 连接到[UInt8]的示例可以略微缩短为:

Data

答案 2 :(得分:3)

(已发布的答案的一些附录;特别是关于UnicodeScalar

在您的问题中,您已使用文字"v"作为要转换为UInt8的基本实例;我们真的不知道这是String还是例如在您的实际使用案例中UnicodeScalar。接受的答案显示了一些巧妙的方法,以防您使用String实例。

如果您恰好使用UnicodeScalar实例(而不是String),则一个答案已经提到了init(ascii:) UInt8初始值设定项。但是,您应该注意,以验证此初始化程序中使用的UnicodeScalar实例确实是符合ASCII字符编码的实例;大多数UnicodeScalar值都不会(这将导致此初始化程序的运行时异常)。您可以使用例如UnicodeScalar的{​​{3}}属性,用于在使用初始化程序之前验证此事实。

let ucScalar: UnicodeScalar = "z"
var a = [UInt8]()
if ucScalar.isASCII {
    a = [UInt8(ascii: ucScalar), 1, 2]
}
else {
    // ... unexpected but not a runtime error
}

另一种方法,如果您要将完整的UnicodeScalar编码为UInt8格式(即使UnicodeScalar不能是单字节ASCII格式endoded)正在使用isASCIIencode(_:into:)方法:

let ucScalar: UnicodeScalar = "z"
var bytes: [UTF8.CodeUnit] = []
UTF8.encode(ucScalar, into: { bytes.append($0) })
bytes += [1, 2]
print(bytes) // [122, 1, 2]

// ...
let ucScalar: UnicodeScalar = "\u{03A3}" // Σ
var bytes: [UTF8.CodeUnit] = []
UTF8.encode(ucScalar, into: { bytes.append($0) })
bytes += [1, 2]
print(bytes) // [206, 163, 1, 2]