JLS Unicode

Translacja Unicode

    Kolejność operacji:

  • Zamiana ucieczek Unicode na znaki Unicode
  • Wyszczególnienie z powyższych znaków końca linii
  • Usunięcie białych znaków i komentarzy

Powyższe kroki są wykonywane przed analizą składniową w kompilacji. Można wykorzystywać ucieczki Unicode w formacie \uxxxx gdzie xxxx to wartość znaku zapisana szesnastkowo. Ma to na celu danie możliwości zapisania w programie znaków Unicode przy wykorzystywaniu tylko znaków ASCII.

\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0063\u006C\u0061\u0073\u0073\u0020\u004F\u006A\u0061\u0063\u0069\u0065\u007B\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0076\u006F\u0069\u0064\u0020\u006D\u0061\u0069\u006E\u0028\u0053\u0074\u0072\u0069\u006E\u0067\u005B\u005D\u0020\u0061\u0072\u0067\u0073\u0029\u007B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006F\u0075\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u006C\u006E\u0028\u0022\u0048\u0065\u006A\u0068\u006F\u0022\u0029\u003B\u007D\u007D zapisane w pliku Ojacie.java można skompilować i uruchomić (raczej z konsoli).

Ucieczki Unicode muszą mieć nieparzystą ilość backslashy: \u0023 to #, \\u0023 to \u0023, \\\u0023 to \# itd …

Ucieczki mogą mieć więcej niż jedno u. Ostatnie musi poprzedzać cztery znaki szesnastkowe inaczej występuje błąd kompilacji (prekompilacji) \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu0023 jest akceptowalne.

Zamiana ucieczek na znaki odbywa się tylko raz: \u005cu0023 nie da w wyniku # (005c to kod \).

Specyfikacja dopuszcza konwersję kodu z Unicode do ASCII. Znaki niemieszczące się w ASCII są tłumaczone na ucieczki, ucieczki mają dodatkowe u np. \uu0023.


Znaki końca linii i pliku

Dopuszczalne znaki końca linii to:

  • CR (\u000d) wykorzystywany w : Commodore, Apple II, Mac OS (do wersji 9), Microware OS-9
  • LF (\u000a) wykorzystywany w: Unix, BeOS, AmigaOS, MorphOS, RISC OS, GNU/Linux, Mac OS, Multics
  • CRLF (\u000d\u000a) wykorzystywane w: DOS, OS/2, Microsoft Windows, Symbian, DEC RT-11.

CRCRLF stworzy tylko jeden znak końca linii. Kompilator może ustalać numery linii na podstawie znaków końca linii. Komentarz rozpoczynający się od // kończy się na znaku końca linii.

Jeśli plik kończy się znakiem SUB (\u001a) przeważnie wysyłanym przez control + Z, to jest on ignorowany.
Jego pełna nazwa to Substitute character. Przy wysłaniu znaku do linuksowego terminala shell wysyła do procesu sygnał SIGSTOP który pauzuje jego wykonywanie. Jest też zwyczajowo używany do oznaczania końca pliku (mimo tego że mogą po nim występować jakieś dane – przeważnie nie będą wyświetlone).

Znak jest także wykorzystywany jeśli nie ma możliwości konwersji znaku z jednej reprezentacji do innej. Pominięcie takiego znaku mogłoby skutkować lukami bezpieczeństwa.
Jeśli moduł dodawania użytkowników korzysta z innego kodowania niż moduł autoryzujący a nieznane znaki są pomijane wtedy jest możliwość utworzenia konta użytkownika o nazwie składającej się z już istniejącego użytkownika z uprawnieniami + znaki nieznane przez system kodowania. Moduł dodawania użytkowników widziałby dwóch różnych użytkowników a moduł uwierzytelniania jednego.


Komentarze i białe znaki

Zawartość komentarzy i białe znaki mogą mieć wpływ na kompilacje.
// char lf = '\u000a'; nie skompiluje się – ucieczka zostanie zmieniona na znak końca linii. Inicjalizacja zmiennej typu char mieć miejsce w jednej linii (dla Stringa nawiasy także muszą być zamknięte w tej samej linii ale można użyć znaku plusa i utworzyć nowy literał w następnej linii który będzie dodany do poprzedniego).
Nie dotyczy to komentarza utworzonego przez /* */ lub umieszczenia \n w komentarzu, które jest przetwarzane w czasie kompilacji nie przed.

Białe znaki mają znaczenie jeśli tokeny (najmniejsze fragmenty składniowe) które rozdzielają tworzą inny token gdy są nierozdzielone. += to operator przypisania ale + = daje błąd kompilacji.


Różne

Identyfikatory są takie same jeśli są reprezentowane za pomocą tych samych znaków Unicode. Czyli mogą być wyświetlane w ten sam sposób a dotyczyć różnych zmiennych.

Literał 2147483648 może wystąpić tylko z minusem inaczej ma miejsce błąd kompilacji. Integer w którym domyślnie są zapisywane literały całkowite ma zakres ujemny o jeden większy od zakresu dodatniego przez zastosowanie zapisu U2. Analogicznie dla longa i wartości 9223372036854775808.
Double i Float także mają minimalne (względem odległości od 0) i maksymalne wartości. Jeśli reprezentacja niezerowej wartości jest reprezentowana jako zero – występuje błąd kompilacji, tak samo jeśli wartością jest nieskończoność.
Przy operacjach w których występują bardzo duże i bardzo małe liczby zmiennoprzecinkowe ich reprezentacje muszą być „sprowadzone do wspólnego mianownika” a konkretnie do wspólnej mantysy co skutkuje utratą informacji na temat małej liczby.

Źródła:
„The Java® Language Specification Java SE 8 Edition” James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley
Wikipedia znaki końca linii
Wikipedia Substitute character
Zalecenia Unicode dt. reprezentowania niemapowalnych znaków
Wikipedia Liczby zmiennoprzecinkowe w informatyce

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *