latajacaryba Temat założony przez niniejszego użytkownika |
Java - inicjalizacja zmiennych char za pomoca unicode » 2017-06-03 21:26:49 Witam. Zaraz mnie szlag trafi. Mam trzy zmienne char char e = \u0030; char d = \u0045; char c = \u0050;
Przy zmiennej c wyskakuje błąd P cannot be resolved to a variable unicode zmienne d jest zaznaczony na niebiesko, przy wypisaniu go System.out.println nie wypisuje mi nic. to samo ze zmienną e. Natomiast zmienna e (jej unicode) w ogóle nie jest kolorowany
A przy char x = \u0040; Syntax error on token "@", invalid Expression
O co chodzi? Dlaczego są takie problemy?
PS. czemu unicode jest zapisywany szesnastkowo a nie w systemie dziesiętnym? |
|
Monika90 |
» 2017-06-03 22:04:43 Zapomniałeś o apostrofach '\u0040' |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-06-03 22:34:18 Nie sądziłem, że są one tu potrzebne :p Szczególnie, że wartość 0045 była zakolorowana na niebiesko. No ale skoro działa to dziękuję i zamykam temat
EDIT: zostawie jednak otwarty, może ktoś jeszcze odpowie na PS.
I jeszcze dlaczego znaki (4 - bajtowe) w utf-16 są kodowane jako "połączenie" dwóch jednostek kodowych (od U+D800 do U+DBFF i od U+DC00 do U+DFFF) zamiast np. od U+FFFF (koniec znaków z zestawu BMP) do 10FFFF(koniec zastawów wszystkich znaków) bez bawienia się w to łączenie jednostek kodowych? czyli: U+0000 - U+FFFF - znaki BMP U+10000 - U+10FFFF - znaki z innych zestawów I dlaczego znaki 4 bajtowe są do 10FFFF skoro 10FFFF to dziesiętnie 1114111 a 4 bajty mają wartość 4294967295? Po prostu nie ma więcej znaków i reszta to wolne miejsce? |
|
Monika90 |
» 2017-06-04 09:19:49 Z początku unikod był 16-bitowy, więc mogło być co najwyżej 65536 znaków. Później okazało się że to za mało. Łączenie dwóch 16-bitowych jednostek kodowych to sposób na upchnięcie dodatkowych znaków bez psucia kompatybilności wstecznej. Ilość znaków (a raczej punktów kodowych) jest ograniczona do 1114111 (a raczej 1112064), bo nie da się zakodować ich więcej w UTF-16. To że w UTF-32 dało by się przedstawić więcej znaków nie ma znaczenia, bo chodzi o to by w każdym kodowaniu (UTF-8, UTF-16 i UTF-32) móc przedstawić wszystkie znaki które są w unikodzie. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-06-04 19:14:41 Łączenie dwóch 16-bitowych jednostek kodowych to sposób na upchnięcie dodatkowych znaków bez psucia kompatybilności wstecznej. |
Czyli zamiast zapisywania jednej jednostki na dwóch bitach zapisujemy dwie na czterech. Po co jest współrzędna jednostki kodowej? z tego co zauważyłem, jeśli chcemy przechować w zmiennej char znak składający się z 2 jednostek kodowych, to piszemy string a = "\ud800\udc00" A napisanie wspł. kodowej nie daje oczekiwanego rezultatu I jeszcze może takie głupie, ale jednak pytanie, dlaczego znaki Unicode są w systemie szesnastkowym a nie decymalnym (jak w ASCII)? Czy to dlatego, że konwersja liczba szesnastkowa -> kod binarny jest łatwiejsza niż system decymalny -> kod binarny ? Przepraszam, że tak Cię męczę, ale to zagadnienie nie daje mi spokoju, a kiedy czegoś się uczę to zawsze chce wszystko dogłębnie poznać :) |
|
Monika90 |
» 2017-06-04 21:16:08 I jeszcze może takie głupie, ale jednak pytanie, dlaczego znaki Unicode są w systemie szesnastkowym a nie decymalnym (jak w ASCII)? Czy to dlatego, że konwersja liczba szesnastkowa -> kod binarny jest łatwiejsza niż system decymalny -> kod binarny ?
|
Nie wiem dlaczego projektanci Javy i C++ postanowili używać liczb zapisanych w systemie szesnastkowym. Prawdopodobne przyczyny to, jak sam zauważyłeś, prostota konwersji oraz to że w systemie dziesiętnym potrzeba by było więcej cyfr do zapisania tej samej liczby. W ogóle używanie systemu szesnastkowego do zapisu kodów znaków jest powszechne, również w przypadku ASCII czy ISO-8859-2, (obejrzyj sobie tabelki w Wikipedii). Za to w HTML-u oprócz zapisu szesnastkowego: Ę jest też dziesiętny: Ę Po co jest współrzędna jednostki kodowej? z tego co zauważyłem, jeśli chcemy przechować w zmiennej char znak składający się z 2 jednostek kodowych, to piszemy string a = "\ud800\udc00" A napisanie wspł. kodowej nie daje oczekiwanego rezultatu
|
Czy chodzi Ci o to że to nie działa String s = "\u10000"; i trzeba pisać tak String s = "\ud800\udc00"; ? W Javie (i w C++) po \u muszą wystąpić dokładnie 4 cyfry szesnastkowe (kolejne cyfry nie będą już interpretowane jako część kodu znaku). W C++ można też użyć \U po którym jest osiem cyfr szesnastkowych. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-06-04 21:47:37 Tak, dokładnie o to mi chodziło. Dziękuję, ogromnie mi pomogłaś, w końcu rozumiem :DD |
|
« 1 » |