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?
@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 ) )
@Lewo: @Lewo: a zrób dumpa calego data[], bajt po bajcie zrzuć na ekran i zobaczymy penie coś ciekawego poza tym czuje że wkrada się tu lityle vs big endian
@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 ).
@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
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
Ty napisałeś
(char) data[0]a
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 ) )
poza tym czuje że wkrada się tu lityle vs big endian
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 ).
Komentarz usunięty przez autora Wpisu
System.in.read wczytuje bajty, nie ma tu zadnej konwersji
dokladnie to byte->int->char i jesli jest - to ten minus pozostaje (wiec nie tylko zerami)
@Lewo:
System operacyjny / kodowanie konsoli ide / czy dany system operacyjny koduje po swojemu a jvm konwertuje to do konkretnego kodowania?
1) taki Windows ma to w dupie i ma w konsoli inne kodowanie, zależne od wersji językowej
2) na