【问题标题】:UTF8 to Base 2 Representation SwiftUTF8 到 Base 2 表示 Swift
【发布时间】:2016-11-20 21:15:02
【问题描述】:

我想知道将 UTF8 数组或字符串转换为其 base 2 表示(每个字符的每个 UTF8 值转换为 base 2 表示)的最佳方法是什么。由于您可以有两个值表示同一字符的代码,我想从数组中提取值然后转换它不是有效的方法。那么是哪一个呢?谢谢!

【问题讨论】:

    标签: swift binary base utf


    【解决方案1】:

    这是一种可能的方法:

    • 枚举字符串的 unicode 标量。
    • 将每个 unicode 标量转换回字符串,并枚举其 UTF-8 编码。
    • 将每个 UTF-8 字节转换为“二进制字符串”。

    最后一个任务可以使用以下通用方法完成 适用于所有无符号整数类型:

    extension UnsignedIntegerType {
        func toBinaryString() -> String {
            let s = String(self, radix: 2)
            let numBits = 8 * sizeofValue(self)
            return String(count: numBits - s.characters.count, repeatedValue: Character("0")) + s
        }
    }
    
    // Example:
    // UInt8(100).toBinaryString() = "01100100"
    // UInt16.max.toBinaryString() = "1111111111111111"
    

    那么转换成UTF-8二进制表示就可以了 像这样实现:

    func binaryUTF8Strings(string: String) -> [String] {
        return string.unicodeScalars.map {
            String($0).utf8.map { $0.toBinaryString() }.joinWithSeparator(" ")
        }
    }
    

    示例用法:

    for u in base2UTF8("H€llö ??") {
        print(u)
    }
    

    输出:

    01001000 11100010 10000010 10101100 01101100 01101100 11000011 10110110 00100000 11110000 10011111 10000111 10101001 11110000 10011111 10000111 10101010

    请注意,“??”是单个字符(“扩展字形簇”) 但是 两个 unicode 标量。

    【讨论】:

    • 非常感谢!这是我在这个主题上见过的最合乎逻辑的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多