swift - 如何在知道字符数但不知道字节数的情况下解码 UTF-8?

标签 swift encoding utf-8

我需要解码一个我不知道字节数的 UTF-8 编码字符串。我确实知道字符数。

根据字节数,我会这样做:

NSString(bytes:    UnsafePointer<Byte>(bytes),
         length:   byteCount,
         encoding: String.Encoding.utf8.rawValue)

如何使用字符数来代替?

最佳答案

一个可能的解决方案是使用 UTF-8 UnicodeCodec 进行解码 字节,直到达到所需的字符数 (或者发生错误):

func decodeUTF8<S: Sequence>(bytes: S, numCharacters: Int) -> String
    where S.Iterator.Element == UInt8 {
        var iterator = bytes.makeIterator()
        var utf8codec = UTF8()
        var string = ""
        while string.characters.count < numCharacters {
            switch (utf8codec.decode(&iterator)) {
            case let .scalarValue(val):
                string.unicodeScalars.append(val)
            default:
                // Error or out of bytes:
                return string
            }
        }
        return string
}

(您还可以返回 nil 或在错误情况下抛出错误。)

示例:

let bytes = "H€llo".utf8
let dec = decodeUTF8(bytes: bytes, numCharacters: 3)
print(dec)  // H€l

关于swift - 如何在知道字符数但不知道字节数的情况下解码 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41334803/

相关文章:

ios - 将 FaSTLane 与 CircleCI 集成 : Cocoapods framework not found

ios - 无法在 Objective C 类中使用 Swift 协议(protocol),因为它会导致段错误 : 11

ios - 如何获取核心数据?

swift - 更改场景中的 SKS 文件

Powershell - ASCII 编码正在将特殊字符更改为问号

ruby - 猜测日志文件中字节流的字符串编码

python - 用一个空格替换非 ASCII 字符

java - Servlet 的 UTF-8 响应

swift - String(validatingUTF8 :) and String(utf8String:)? 之间有区别吗

ios - 当查询参数包含&符号时编码 NSURL