UTF8 到 Base 2 表示 Swift
UTF8 to Base 2 Representation Swift
我想知道将 UTF8 数组或字符串转换为其基数 2 表示(每个字符的每个 UTF8 值为其基数 2 表示)的最佳方法是什么。由于您可能有两个值代表同一个字符的代码,我想从数组中提取值然后转换它不是一个有效的方法。那么是哪一个呢?谢谢!
这是一个可能的方法:
- 枚举字符串的 unicode 标量。
- 将每个 unicode 标量转换回字符串,并枚举其
UTF-8编码。
- 将每个 UTF-8 字节转换为 "binary string".
最后一个任务可以用下面的通用方法完成
适用于所有无符号整数类型:
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([=11=]).utf8.map { [=11=].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
请注意,“”是单个字符("extended grapheme cluster")
但是 两个 unicode 标量。
我想知道将 UTF8 数组或字符串转换为其基数 2 表示(每个字符的每个 UTF8 值为其基数 2 表示)的最佳方法是什么。由于您可能有两个值代表同一个字符的代码,我想从数组中提取值然后转换它不是一个有效的方法。那么是哪一个呢?谢谢!
这是一个可能的方法:
- 枚举字符串的 unicode 标量。
- 将每个 unicode 标量转换回字符串,并枚举其 UTF-8编码。
- 将每个 UTF-8 字节转换为 "binary string".
最后一个任务可以用下面的通用方法完成 适用于所有无符号整数类型:
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([=11=]).utf8.map { [=11=].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
请注意,“”是单个字符("extended grapheme cluster") 但是 两个 unicode 标量。