Wpis z mikrobloga

Szybkie pytanie. W Java typ char ma 16bitów, byte 8bitów.
Fragment kodu

byte[] data = new byte[10];
System.in.read(data);
System.out.println((char)data[0]);

In: asdf
Out: a
- dlaczego pojedyńczy znak z wejścia zajmuje akurat bajt? "co" konwertuje input na bity i w jaki sposób?
- rozumiem, że (char)data[0] to konwersja do szerszego typu ( byte -> char ) i starsze bity uzupełnia zerami?

#java #naukaprogramowania
  • 11
@Lewo: jak dobrze pamiętam kolejność operatorów to rzutowanie robi się po wyłuskaniu więc tak to #!$%@? sprawdzisz.
nie znam niestety mocno javy by Ci powiedziec co masz zmienić by dosatać ten drugi kod z C
@wytrzzeszcz: ale działa to intuicyjnie, tzn wczytało z wejścia do tablicy, potem każdy element tablicy to kolejne znaki z wejścia.
Mnie interesuje dlaczego akurat metoda read ( która wczytuje kolejne bajty z wejścia i daje do kolejnych elementów tablicy ) traktuje jeden znak jak 1 bajt ( czyli jakie dokładnie kodowanie znaku widzi read i co jest odpowiedzialne za kodowanie znaku podanego na input ( tutaj konsola ide ) )
@wytrzzeszcz: piszę w Javie ( dumpy trochę utrudnione ) i aż tak mnie nie interesuje. Proste pytanie, liczę na prostą odpowiedź bez zbędnych badań.
Jedyne co zauważyłem, że polskie znaki ( spoza 256znaków które są kodowane na 8 bitach ) już niepoprawnie obsługuje ( co sugerowałoby, że "coś" zakodowało wejście jakimś unicodem i polskie znaki już są na 16bitach ).
dlaczego pojedyńczy znak z wejścia zajmuje akurat bajt? "

System.in.read wczytuje bajty, nie ma tu zadnej konwersji

rozumiem, że (char)data[0] to konwersja do szerszego typu ( byte -> char ) i starsze bity uzupełnia zerami?

dokladnie to byte->int->char i jesli jest - to ten minus pozostaje (wiec nie tylko zerami)

@Lewo:
@afe1: dobra, ale System.in.read skądś dostaje bity. Te miejsce po naciśnięciu klawisza dostaje w bitach informacje o wciśniętym klawiszu. Co i jakim kodowaniem zapisuje informacje o inpucie do System.in?
System operacyjny / kodowanie konsoli ide / czy dany system operacyjny koduje po swojemu a jvm konwertuje to do konkretnego kodowania?
@Lewo: System.in (czyli standardowe wejście) to po prostu strumień bajtów; o tym, co do niego idzie, decyduje konsola albo inny proces podłączony do wejścia. Jeśli to w ogóle jest tekst (bo nie musi), to JVM może co najwyżej zgadywać, że jest on w tym samym kodowaniu, co domyślne kodowanie systemowe, ale
1) taki Windows ma to w dupie i ma w konsoli inne kodowanie, zależne od wersji językowej
2) na systemach