2009-09-10 4 views
13

W mojej aplikacji Java I zostały przekazane w ciągu znaków, który wygląda tak:Drukuj Łańcuch znaków Unicode jako rzeczywisty charakter

„\ u00a5123”

Przy drukowaniu ten ciąg do konsoli, otrzymuję ten sam ciąg co dane wyjściowe (zgodnie z oczekiwaniami).

Jednak chcę to wydrukować, zamieniając kod Unicode na rzeczywisty symbol jena (\ u00a5 -> symbol jena) - jak mam to zrobić?

czyli tak wygląda to tak: "[jena symbol] 123"

+0

Aby uzyskać lepszy obraz przestrzeni problemu, czy nie ma sposobu na uzyskanie odpowiedniego ciągu znaków Unicode? W jakim kontekście jest to używane? Czy czas/prędkość to ważny aspekt? – aperkins

+0

Czy są też jakieś założenia upraszczające? tj. czy jest to jedyny przypadek "\ u ####"? Ponieważ wtedy możesz użyć wyrażenia regularnego, aby wyciągnąć liczbę. – aperkins

+0

możliwy duplikat [Howto unescape literał napisany w języku Java w Javie] (http://stackoverflow.com/questions/3537706/howto-unescape-a-java-string-literal-in-java) –

Odpowiedz

15

Napisałem mały program:

public static void main(String[] args) { 
    System.out.println("\u00a5123"); 
} 

To wyjście:

¥ 123

tzn. Wyprowadza dokładnie to, co podano w swoim poście. Nie jestem pewien, czy nie dzieje się coś innego. Jakiej wersji Java używasz?

edit:

W odpowiedzi na wyjaśnienia, istnieje kilka różnych technik. Najprościej jest poszukać znaku "\ u", a następnie 4 znaków w kodzie szesnastkowym, wyodrębnić ten fragment i zamienić go na wersję unicode z kodem szesnastkowym (używając klasy Character). Zakłada to oczywiście, że ciąg nie będzie \ u przed nim.

Nie jestem świadomy żadnego konkretnego systemu do parsowania String tak, jakby był zakodowany ciąg Java.

+0

Masz rację mówiąc, że bezpośrednie drukowanie ciągu da ci prawidłowe wyniki. Jednak ktoś przekazał mi ciąg znaków, który jest zasadniczo uciekł. Załóżmy więc, że twoja główna metoda nadal istnieje, ale nazwałeś metodę o nazwie foo w następujący sposób: foo ("\\ u00a5123"); <- zanotuj ucieczkę ciągu znaków - tak w zasadzie parametr, który dostaję wewnątrz metody foo, to ciąg znaków, który mam do czynienia z – digiarnie

+0

Zamiana odwrotnego ukośnika to coś, z czym musi poradzić sobie tylko kompilator Java, a nie JVM czy API. Nie jest więc zaskakujące, że nie ma łatwego sposobu na przeanalizowanie takich łańcuchów w czasie wykonywania. –

+0

@Todd zgodził się - o jedynej rzeczy, o której mogłem myśleć, to próba użycia kompilatora w jakiś sposób - ale to brzmi dla mnie jak kłopot. – aperkins

1

Prawdopodobnie będziesz musiał napisać dla nich analizę, chyba że znajdziesz ją w bibliotece innej firmy. W JDK nie ma nic do przetestowania ich, wiem, ponieważ całkiem niedawno wpadłem na pomysł wykorzystania tego rodzaju ucieczek jako sposobu na przemycenie unicode przez bazę danych tylko dla Latin-1. (Skończyło się na zrobieniu czegoś innego)

Powiem ci, że java.util.Property ucieka i usuwa znaki Unicode w ten sposób podczas odczytu i zapisu plików (ponieważ pliki muszą być w formacie ASCII). Metody, których używa do tego, są prywatne, więc nie możesz ich wywoływać, ale możesz użyć kodu źródłowego JDK, by zainspirować swoje rozwiązanie.

+0

Trochę zawikłany, ale prawdopodobnie możesz wyemitować ciąg znaków jako wartość do pliku właściwości w pamięci, a następnie odczytać go przy użyciu klasy "Właściwości". – McDowell

2

Jak już wcześniej wspomniano, te łańcuchy będą musiały zostać przeanalizowane, aby uzyskać pożądany rezultat.

  1. Wpisz tekst w token za pomocą \ u jako separatora. Na przykład: \u63A5\u53D7 => { "63A5", "53D7" }

  2. przetworzyć te ciągi następująco:

    String hex = "63A5"; 
    int intValue = Integer.parseInt(hex, 16); 
    System.out.println((char)intValue); 
    
0

może zastąpić wyżej z tym:

System.out.println((char)0x63A5); 

Oto kod, aby wydrukować cały budynek skrzynki znaki Unicode.

public static void printBox() 
{ 
    for (int i=0x2500;i<=0x257F;i++) 
    { 
     System.out.printf("0x%x : %c\n",i,(char)i); 
    } 
}