gpt4 book ai didi

string - 有没有办法在 swift 中从 utf16 数组创建字符串?

转载 作者:行者123 更新时间:2023-11-29 05:26:51 25 4
gpt4 key购买 nike

我们知道 String.utf16 提供代码单元或 String.unicodeScalars 提供标量。

如果我们通过删除一些元素等来操作 codeunits 和 unicodeScales,有没有办法构造回结果字符串?

最佳答案

Swift 2.1 更新:

您可以从 UTF-16 字符数组创建字符串

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/58078574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com