Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Java - inicjalizacja zmiennych char za pomoca unicode

Ostatnio zmodyfikowano 2017-06-04 21:47
Autor Wiadomość
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?
P-162036
Monika90
» 2017-06-03 22:04:43
Zapomniałeś o apostrofach '\u0040'
P-162037
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?
P-162039
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.
P-162042
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ć :)
P-162055
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.
P-162059
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
P-162061
« 1 »
  Strona 1 z 1