Я немного кодировал с помощью String в Java8, Java 11, но этот вопрос основан на Java 8. У меня есть этот небольшой фрагмент.
final char e = (char)200;//È
Я просто думал, что символы между 0,255 [Ascii + расширенный Ascii] всегда будут помещаться в байт только потому, что 2 ^ 8 = 256, но это не так, я попробовал на веб-сайте https://mothereff.in/byte-counter и указывает, что символ занимает 2 байта, может кто-нибудь объяснить мне.
Другой вопрос во многих сообщениях гласит, что Java - это UTF-16, но на моей машине под управлением Windows 7 в этом фрагменте возвращается UTF-8.
String csn = Charset.defaultCharset().name();
Зависит ли эта платформа?
Другие вопросы, которые у меня есть, попробуйте этот фрагмент.
final List<Charset>charsets = Arrays.asList(StandardCharsets.ISO_8859_1,StandardCharsets.US_ASCII,StandardCharsets.UTF_16,StandardCharsets.UTF_8);
charsets.forEach(a->print(a,"È"));
System.out.println("getBytes");
System.out.println(Arrays.toString("È".getBytes()));
charsets.forEach(a->System.out.println(a+" "+Arrays.toString(sb.toString().getBytes(a))));
private void print(final Charset set,final CharSequence sb){
byte[] array = new byte[4];
set.newEncoder()
.encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
final String buildedString = new String(array,set);
System.out.println(set+" "+Arrays.toString(array)+" "+buildedString+"<<>>"+buildedString.length());
}
И печатает
run:
ISO-8859-1 [-56, 0, 0, 0] È//PERFECT USING 1 BYTE WHICH IS -56
US-ASCII [0, 0, 0, 0] //DONT GET IT SEE THIS ITEM FOR LATER
UTF-16 [-2, -1, 0, -56] È<<>>1 //WHAT IS -2,-1 BYTE USED FOR? I HAVE TRY WITH OTHER EXAMPLES AND THEY ALWAYS APPEAR AM I LOSING TWO BYTES HERE??
UTF-8 [-61, -120, 0, 0] 2 È //SEEMS TO MY CHARACTER NEEDS TWO BYTES?? I THOUGHT THAT CODE=200 WOULD REQUIRE ONLY ONE
getBytes
[-61, -120]//OK MY UTF-8 REPRESENTATION
ISO-8859-1 [-56]//OK
US-ASCII [63]//OK BUT WHY WHEN I ENCODE IN ASCCI DOESNT GET ANY BYTE ENCODED?
UTF-16 [-2, -1, 0, -56]//AGAIN WHAT ARE -2,-1 IN THE LEADING BYTES?
UTF-8 [-61, -120]//OK
я пробовал
System.out.println(new String(new byte[]{-1,-2},"UTF-16"));//SIMPLE "" I AM WASTING THIS 2 BYTES??
В резюме.
Почему UTF-16 всегда имеет два начальных байта, они тратятся впустую? новый байт[]{-1,-2}
Почему, когда я кодирую «È», я не получаю никаких байтов в кодировке ASCCI, но когда я делаю È.getBytes(StandardCharsets.US_ASCII), я получаю {63}?
Java использует UTF-16, но в моем случае UTF-8 зависит от платформы?
Извините, если этот пост сбивает с толку
Окружающая обстановка
Windows 7 64 Bits Netbeans 8.2 with Java 1.8.0_121