Причину уже объяснил ответ Парсифаля. Просто для полноты, вот код, который эквивалентен 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);
}