原因已經由parsifal的答案解釋。只是爲了完整性,這裏是這相當於data.getBytes("ISO-8859-1")
代碼(假設這個字符串是一個純粹的UCS-2字符串,沒有代理對):
byte[] rawdata = new byte[data.length()];
for(int i = 0; i < data.length; i++) {
char c = data.charAt(i);
if (c > 255) {
rawData[i] = (byte)'?';
}
else {
rawData[i] = (byte)c;
}
}
隨着替代品(如真正的UTF-16)開始有點更復雜:
byte[] rawData = new byte[data.length()];
int j = 0;
for(int i = 0; i < data.length; i++, j++) {
int c = data.codePointAt(i);
if(c < 0x100) {
rawData[j] = (byte)c;
}
else {
rawData[j] = (byte)'?';
if(c >= 0x10000) {
// surrogate pair
i++;
}
}
}
if(j < rawData.length) {
rawData = Arrays.copyOf(rawData, j);
}
或者,只是用charAt()
:
byte[] rawData = new byte[data.length()];
int j = 0;
for(int i = 0; i < data.length; i++, j++) {
char c = data.charAt(i);
if(c < 0x100) {
rawData[j] = (byte)c;
}
else {
rawData[j] = (byte)'?';
if(Character.isHighSurrogate(c) && Character.isLowSurrogate(data.charAt(i+1))) {
// surrogate pair
i++;
}
}
}
if(j < rawData.length) {
rawData = Arrays.copyOf(rawData, j);
}
不,這將是一個「真子集」,如果當'UTF-16'和編碼'字符串導致相同的字節ISO-8859 -1',這顯然沒有。 –
我可能會做錯事。我將通過比較來自兩種不同方法的兩個字節來仔細檢查。 – joeforker