UTF-16データストリームをチャンクに分割する際に助けを求めることができますか?swift utf16データストリーム - チャンクに分割する問題
残念ながら、文字の境界を見つけることにはかなり苦しんでいます。
何か助けていただきありがとうございました。この問題について何度かお伺いしましたが、この問題を理解することが大好きです。
だけで正常に動作するJavaのバージョンは、(最初の2つのバイトを分割する場合でも、出力はその2として正しい文字列を与えるよう任意の自動修正がありますか?):
public static void main(String[] args) throws Exception {
String encoding = "UTF-16";
byte[] data = "ČŘŠŤĎŽŇčřšťďňě".getBytes(encoding);
System.out.println("Data size: "+data.length);
for(int index=2; index<= data.length/2; index+=2)
{
byte[] part1 = java.util.Arrays.copyOfRange(data, 0, index);
byte[] part2 = java.util.Arrays.copyOfRange(data, index, data.length);
assert(part1.length + part2.length == data.length);
System.out.println("--------------------- "+index);
System.out.println(new String(part1, encoding));
System.out.println(new String(part2, encoding));
}
}
Java出力:
Data size: 30
--------------------- 2
ČŘŠŤĎŽŇčřšťďňě
--------------------- 4
Č
ŘŠŤĎŽŇčřšťďňě
--------------------- 6
ČŘ
ŠŤĎŽŇčřšťďňě
--------------------- 8
....
スウィフト(Xcodeの8ベータ6、スイフト3)遊び場コード:
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))
}
スウィフト出力:
Data size: 30
--------------------- 2
Optional("")
Optional("ఁ堁态搁ก紁䜁ഁ夁愁攁༁䠁ᬁ")
--------------------- 4
Optional("Č")
Optional("堁态搁ก紁䜁ഁ夁愁攁༁䠁ᬁ")
--------------------- 6
Optional("ČŘ")
Optional("态搁ก紁䜁ഁ夁愁攁༁䠁ᬁ")
--------------------- 8
Optional("ČŘŠ")
Optional("搁ก紁䜁ഁ夁愁攁༁䠁ᬁ")
--------------------- 10
Optional("ČŘŠŤ")
Optional("ก紁䜁ഁ夁愁攁༁䠁ᬁ")
--------------------- 12
Optional("ČŘŠŤĎ")
Optional("紁䜁ഁ夁愁攁༁䠁ᬁ")
私はString.Encoding.utf8に迅速エンコーディングを変更した場合、予想通り、出力されますが、UTF16およびUTF32のために、私は何が起こっているかを理解していません。
ありがとうございました。
ありがとう!これは理にかなって、JavaのUTF-16のデフォルトの処理はおそらく少し異なります。 – ds77