作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们知道 String.utf16 提供代码单元或 String.unicodeScalars 提供标量。
如果我们通过删除一些元素等来操纵代码单元和 unicodeScales,是否有办法构造回结果字符串?
最佳答案
Swift 2.1 更新:
您可以从一个 UTF-16 字符数组创建一个 String
与
public init(utf16CodeUnits: UnsafePointer<unichar>, count: Int)
初始化器。示例:
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 😄
上一个答案:
没有什么“内置的”(据我所知),但您可以使用 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
}
}
例子:
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 😄
}
稍微通用,您可以定义一个创建字符串的方法从代码点数组(或任何序列)中,使用给定的编解码器:
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
}
}
然后UTF16的转换完成
if let str2a = String(codeUnits: utf16array, codec: UTF16()) {
print(str2a)
}
这是另一种可能的解决方案。虽然以前的方法是“纯 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
}
}
}
关于string - 有没有办法在 swift 中从 utf16 数组创建一个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24542170/
我是一名优秀的程序员,十分优秀!