use*_*504 4 string bytearray swift
我们知道String.utf16提供了codeunits或String.unicodeScalars提供了标量.
如果我们通过删除一些元素来操纵codeunits和unicodeScales等,有没有办法构造回来的结果字符串?
Swift 2.1的更新:
你可以用String一个UTF-16字符数组创建一个
public init(utf16CodeUnits: UnsafePointer<unichar>, count: Int)
Run Code Online (Sandbox Code Playgroud)
初始化.例:
let str = "H€llo "
// String to UTF16 array:
let utf16array = Array(str.utf16)
print(utf16array)
// Output: [72, 8364, 108, 108, 111, 32, 55357, 56836]
// UTF16 array to string:
let str2 = String(utf16CodeUnits: utf16array, count: utf16array.count)
print(str2)
// H€llo
Run Code Online (Sandbox Code Playgroud)
上一个答案:
没有"内置"(据我所知),但您可以使用UTF16提供decode()方法的结构:
extension String {
init?(utf16chars:[UInt16]) {
var str = ""
var generator = utf16chars.generate()
var utf16 : UTF16 = UTF16()
var done = false
while !done {
let r = utf16.decode(&generator)
switch (r) {
case .EmptyInput:
done = true
case let .Result(val):
str.append(Character(val))
case .Error:
return nil
}
}
self = str
}
}
Run Code Online (Sandbox Code Playgroud)
例:
let str = "H€llo "
// String to UTF16 array:
let utf16array = Array(str.utf16)
print(utf16array)
// Output: [72, 8364, 108, 108, 111, 32, 55357, 56836]
// UTF16 array to string:
if let str2 = String(utf16chars: utf16array) {
print(str2)
// Output: H€llo
}
Run Code Online (Sandbox Code Playgroud)
稍微更通用,您可以使用给定的编解码器定义一个从代码点的数组(或任何序列)创建字符串的方法:
extension String {
init?<S : SequenceType, C : UnicodeCodecType where S.Generator.Element == C.CodeUnit>
(codeUnits : S, 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
}
}
Run Code Online (Sandbox Code Playgroud)
然后从UTF16转换为
if let str2a = String(codeUnits: utf16array, codec: UTF16()) {
print(str2a)
}
Run Code Online (Sandbox Code Playgroud)
这是另一种可能的解决方案 虽然以前的方法是"纯Swift",但是这个方法使用了Foundation框架NSString和Swift 之间的自动桥接String:
extension String {
init?(utf16chars:[UInt16]) {
let data = NSData(bytes: utf16chars, length: utf16chars.count * sizeof(UInt16))
if let ns = NSString(data: data, encoding: NSUTF16LittleEndianStringEncoding) {
self = ns as String
} else {
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud)