Массив байтов не похож на UTF-8. Обратите внимание, что \ufffd
(с именем REPLACEMENT CHARACTER
) - это ", используемый для замены входящего символа, значение которого неизвестно или не может быть представлено в Unicode."
Приложение: Вот простой пример того, как это может произойти. При приведении к byte
кодовая точка для ñ
не является ни UTF-8, ни US-ASCII; но является действующим ISO-8859-1. По сути, вы должны знать, что представляют байты, прежде чем сможете их кодировать в String
.
public class Hello {
public static void main(String[] args)
throws java.io.UnsupportedEncodingException {
String s = "Hola, señor!";
System.out.println(s);
byte[] b = new byte[s.length()];
for (int i = 0; i < b.length; i++) {
int cp = s.codePointAt(i);
b[i] = (byte) cp;
System.out.print((byte) cp + " ");
}
System.out.println();
System.out.println(new String(b, "UTF-8"));
System.out.println(new String(b, "US-ASCII"));
System.out.println(new String(b, "ISO-8859-1"));
}
}
Выход:
Hola, señor!
72 111 108 97 44 32 115 101 -15 111 114 33
Hola, se�or!
Hola, se�or!
Hola, señor!