2011-11-09 10 views
15

Jak wstawić dodatkowy znak Unicode (powiedzmy, kodepoint 10400) w literał łańcuchowy? Próbowałem wprowadzenie zastępczego parę tak:Jak umieścić dodatkowy znak Unicode w literale ciągu?

String text = "TEST \uD801\uDC00"; 
System.out.println(text); 

ale nie wydają się działać.

UPDATE:

Dobrą wiadomością jest to, łańcuch jest prawidłowo skonstruowany.
Bajt Tablica UTF-8 54 45 53 54 20 f 0 90 90 80
Bajt Tablica UTF-16: fe ff 0 54 0 45 0 53 0 54 0 20 D8 1 dc 0

jednak zła nowością jest, że nie jest drukowana poprawnie (w moim polu Fedory) i widzę kwadrat zamiast oczekiwanego symbolu (moja konsola nie obsługuje poprawnie unicodu).

+2

Co masz na myśli mówiąc, że nie wydaje się do pracy? Jaka jest wartość 'text.charAt (5)'? – Mats

+0

Nie drukuje poprawnie symbolu. Może to być coś ze strumieniem wyjściowym. – n0rm1e

+0

Uważam, że "małe pudełko" służy do reprezentowania postaci, której system nie może wyświetlić. Może to po prostu oznaczać, że czcionka używana na ekranie, na której próbujesz wyświetlić dane wyjściowe, nie dostarcza glifu dla tej postaci. – neuralmer

Odpowiedz

12

"Działa dla mnie", na czym dokładnie polega problem?

public static void main (String[] args) throws Exception { 
    int cp = 0x10400; 
    String text = "test \uD801\uDC00"; 
    System.out.println("cp: " + cp); 
    System.out.println("found: " + text.codePointAt(5)); 
    System.out.println("len: " + text.length()); 
} 

wyjściowa:

cp: 66560 
found: 66560 
len: 7 

Należy pamiętać, że długość - jak większość metod String - dotyczy char s, a nie znaków Unicode. Tyle na wsparcie Unicode :)

Happy kodowania.

+0

'cp: 66560' ' found: 66560' –

+0

Dzięki, wygląda na to, że coś jest nie tak ze strumieniem wyjściowym, ponieważ bajt [] otrzymuję od text.getBytes() jest w porządku. – n0rm1e

+2

@ houman001 Pamiętaj, aby * zawsze * - z wyjątkiem tych przypadków, o których teraz już wiem;) - określ kodowanie z 'getBytes' :) Lest it" koduje ten ciąg do sekwencji bajtów ** używając domyślnego zestawu znaków platformy ** ". Podobne wstrzymania dla 'new String (byte [])'. Jeśli używane jest prawidłowe kodowanie (określone lub nie), wynik wysyłany do strumienia powinien być poprawny: ale program (lub terminal) z drugiej strony może się nie zgadzać. –

4

To ma pracować przy użyciu:

System.out.println(
    "text = " + new String(Character.toChars(h)) 
); 

ale wyjście jest:

text = ? 
+2

Zakładając, że h jest prawidłowe: 'System.out' koduje dane do domyślnego zestawu znaków systemu (może to być konwersja stratna); urządzenie, do którego piszesz, musi używać tego samego zestawu znaków (nie zawsze tak jest); urządzenie musi obsługiwać czcionki dla grafemu, który chcesz wyświetlić. – McDowell

+3

Nie wspominając już o tym, że jeśli mówimy o konsoli Windows: gdy dostęp do niej odbywa się za pomocą funkcji stdio jak w Javie, jest on uszkodzony i nie radzi sobie z postaciami spoza strony kodowej ANSI (nie mówiąc już o postaciach z Planów Astralnych) . – bobince

Powiązane problemy