swift utf16数据流-分块发布
我可以请求帮助将UTF-16数据流拆分成块吗 不幸的是,找到字母边界相当痛苦 感谢您的帮助,我们已经花了好几个晚上在这方面,希望您能理解这个问题 工作正常的Java版本(是否有任何自动更正,即使在拆分前两个字节时,输出也会给出正确的字符串,如第2部分所示): Swift(Xcode 8 beta 6,Swift 3)操场代码:swift utf16数据流-分块发布,swift,stream,utf-16,Swift,Stream,Utf 16,我可以请求帮助将UTF-16数据流拆分成块吗 不幸的是,找到字母边界相当痛苦 感谢您的帮助,我们已经花了好几个晚上在这方面,希望您能理解这个问题 工作正常的Java版本(是否有任何自动更正,即使在拆分前两个字节时,输出也会给出正确的字符串,如第2部分所示): Swift(Xcode 8 beta 6,Swift 3)操场代码: import Foundation let encoding = String.Encoding.utf16 let data = "ČŘŠŤĎŽŇčřšťďňě".d
import Foundation
let encoding = String.Encoding.utf16
let data = "ČŘŠŤĎŽŇčřšťďňě".data(using: encoding)!
print("Data size: \(data.count)")
for index in stride(from: 2, to: data.count/2, by: 2)
{
let part1 = data.subdata(in: 0..<index)
let part2 = data.subdata(in: index..<data.count)
assert(part1.count + part2.count == data.count)
print("--------------------- \(index)")
print(String(data: part1, encoding: encoding))
print(String(data: part2, encoding: encoding))
}
如果我将swift编码更改为String.encoding.utf8,则输出与预期一样,但对于utf16和utf32,我不了解发生了什么
谢谢。简短回答:使用utf16LittleEndian
或utf16BigEndian
编码
要获得预期结果,请执行以下操作:
Data size: 28
--------------------- 2
Optional("Č")
Optional("ŘŠŤĎŽŇčřšťďňě")
--------------------- 4
Optional("ČŘ")
Optional("ŠŤĎŽŇčřšťďňě")
--------------------- 6
Optional("ČŘŠ")
Optional("ŤĎŽŇčřšťďňě")
...
当数据被分为两部分时,第二部分就没有了
前导字节顺序标记:
let part1 = data.subdata(in: 0..<4)
let part2 = data.subdata(in: 4..<8)
print(part1 as NSData, part2 as NSData) // <fffe6100> <62006300>
简短回答:使用utf16LittleEndian
或utf16BigEndian
编码
要获得预期结果,请执行以下操作:
Data size: 28
--------------------- 2
Optional("Č")
Optional("ŘŠŤĎŽŇčřšťďňě")
--------------------- 4
Optional("ČŘ")
Optional("ŠŤĎŽŇčřšťďňě")
--------------------- 6
Optional("ČŘŠ")
Optional("ŤĎŽŇčřšťďňě")
...
当数据被分为两部分时,第二部分就没有了
前导字节顺序标记:
let part1 = data.subdata(in: 0..<4)
let part2 = data.subdata(in: 4..<8)
print(part1 as NSData, part2 as NSData) // <fffe6100> <62006300>
非常感谢。这是有道理的,UTF-16的java默认处理可能会有所不同。谢谢!这是有道理的,UTF-16的java默认处理可能会有点不同。
let data = "abc".data(using: .utf16)!
print(data as NSData) // <fffe6100 62006300>
let part1 = data.subdata(in: 0..<4)
let part2 = data.subdata(in: 4..<8)
print(part1 as NSData, part2 as NSData) // <fffe6100> <62006300>
print(String(data: part1, encoding: .utf16)) // Optional("a")
print(String(data: part2, encoding: .utf16)) // Optional("戀挀")
print(String(data: part2, encoding: .utf16LittleEndian)) // Optional("bc")