Chcę wyświetlić znak Unicode w Javie. Jeśli to zrobię, działa dobrze:
String symbol = "\u2202";
symbol jest równy „∂”. To jest to czego chce.
Problem polega na tym, że znam numer Unicode i muszę na jego podstawie stworzyć symbol Unicode. Próbowałem (dla mnie) oczywistej rzeczy:
int c = 2202;
String symbol = "\\u" + c;
Jednak w tym przypadku symbol jest równy „\ u2202”. Nie tego chcę.
Jak mogę skonstruować symbol, jeśli znam jego numer Unicode (ale tylko w czasie wykonywania - nie mogę go zakodować na stałe, jak w pierwszym przykładzie)?
Odpowiedzi:
Po prostu prześlij swoje
int
dochar
. Możesz przekonwertować to naString
usingCharacter.toString()
:EDYTOWAĆ:
Pamiętaj tylko, że sekwencje ucieczki w kodzie źródłowym Javy (
\u
bity) są w formacie HEX, więc jeśli próbujesz odtworzyć sekwencję ucieczki, będziesz potrzebować czegoś takiegoint c = 0x2202
.źródło
c
jest mniejsza niż 0x10000, w przeciwnym razie to podejście okropnie się zepsuje.Java chars go up to 0xFFFF
. Nie wiedziałem tego.Jeśli chcesz uzyskać jednostkę kodu zakodowaną w UTF-16 jako a
char
, możesz przeanalizować liczbę całkowitą i rzutować na nią, jak sugerowali inni.Jeśli chcesz obsługiwać wszystkie punkty kodowe, użyj
Character.toChars(int)
. Pozwoli to rozwiązać przypadki, w których punkty kodowe nie mieszczą się w jednejchar
wartości.Doc mówi:
źródło
char
.scala> "👨🎨".map(_.toInt).flatMap((i: Int) => Character.toChars(i)).map(_.toHexString)
dajeres11: scala.collection.immutable.IndexedSeq[String] = Vector(f468, 200d, f3a8)
ten emotikon, „męski”, piosenkarka jest skierowana z trzech punktów kodowychU+1f468
,U+200d
aU+1f3a8
. Brakuje najbardziej znaczącej cyfry. Mogę to dodać za pomocą bitowego OR ( stackoverflow.com/a/2220476/1007926 ), ale nie wiem, jak określić, które przeanalizowane znaki zostały obcięte. Dzięki!Inne odpowiedzi tutaj albo obsługują tylko unicode do U + FFFF (odpowiedzi dotyczą tylko jednego wystąpienia znaku) lub nie mówią, jak dostać się do właściwego symbolu (odpowiedzi kończą się na Character.toChars () lub używają niewłaściwej metody po tym), więc tutaj również dodaję moją odpowiedź.
Aby obsługiwać również dodatkowe punkty kodowe, należy wykonać następujące czynności:
Zrobiłem też szybki test, które metody konwersji działają, a które nie
źródło
new String(Character.toChars(121849));
psuje się w konsoli Eclipse, ale wersja trzywierszowa działa.str4
zadania nie powinnocode
byćcodePoint
zamiast tego?Pamiętaj, że
char
jest to typ całkowity i dlatego można mu przypisać wartość całkowitą, a także stałą char.źródło
int
którego szukałeś. Szukałeś 0x2202. Moja wina. W każdym razie, jeśli maszint
punkt kodowy, którego szukasz, możesz po prostu rzucić go na achar
i użyć (do skonstruowania,String
jeśli chcesz).Ten działał dobrze dla mnie.
Teraz text2 będzie miał ∂.
źródło
źródło
Tak to się robi:
To rozwiązanie jest autorstwa Arne Vajhøj.
źródło
int c = 2202
, co jest złe! Lepszym rozwiązaniem niż to jest łatwo powiedzieć,int c = 0x2202
które zaoszczędzi ci przechodzenia przez String itp.char ccc...
linii. Po prostu użyj,int cc = 0x2202;
a potemfinal String text=String.valueOf(cc);
Chociaż jest to stare pytanie, istnieje bardzo łatwy sposób na zrobienie tego w Javie 11, który został wydany dzisiaj: możesz użyć nowego przeciążenia Character.toString () :
Ponieważ ta metoda obsługuje dowolny punkt kodu Unicode, długość zwracanego ciągu niekoniecznie wynosi 1.
Kod potrzebny do przykładu podanego w pytaniu to po prostu:
Takie podejście ma kilka zalet:
char
.char[]
, co często jest tym, czego chcesz. Odpowiedź wysłana przez McDowell jest odpowiednia, jeśli chcesz, aby punkt kodowy został zwrócony jakochar[]
.źródło
int codePoint = 0x2202;
Wtedy:String s = Character.toString(codePoint); // <<< Requires JDK 11 !!!
Lub w jednej linii:System.out.println(Character.toString(0x2202)); // Prints ∂
Mam nadzieję, że pomoże to komuś innemu w korzystaniu z tej funkcji JDK 11.Poniższy kod zapisze 4 znaki Unicode (reprezentowane przez cyfry po przecinku) dla słowa „być” w języku japońskim. Tak, czasownik „być” w języku japońskim ma 4 znaki! Wartość znaków jest dziesiętna i została wczytana do tablicy String [] - na przykład za pomocą split. Jeśli masz ósemkę lub szesnastkę, parseInt weź również radix.
źródło
Oto blok do drukowania znaków Unicode między
\u00c0
do\u00ff
:źródło
Niestety, usunięcie jednego luzu, jak wspomniano w pierwszym komentarzu (newbiedoodle), nie prowadzi do dobrego wyniku. Większość (jeśli nie wszystkie) błędów składni IDE. Powodem jest to, że format Java Escaped Unicode wymaga składni „\ uXXXX”, gdzie XXXX to 4 cyfry szesnastkowe, które są obowiązkowe. Próby złożenia tego sznurka z kawałków nie powiodły się. Oczywiście „\ u” to nie to samo, co „\\ u”. Pierwsza składnia oznacza ucieczkę „u”, druga oznacza ucieczkę odwrotną (czyli luz), po której następuje „u”. Dziwne, że na stronach Apache jest prezentowane narzędzie, które robi dokładnie to zachowanie. Ale w rzeczywistości jest to narzędzie naśladujące Escape . Apache ma własne narzędzia (nie testowałem ich), które wykonują tę pracę za Ciebie. Być może, nadal nie jest to to, co chcesz mieć.Ale to narzędzie 1mieć dobre podejście do rozwiązania. Z kombinacją opisaną powyżej (MeraNaamJoker). Moim rozwiązaniem jest utworzenie tego ciągu mimicznego Escaped, a następnie przekonwertowanie go z powrotem na Unicode (aby uniknąć rzeczywistego ograniczenia Escaped Unicode). Użyłem go do kopiowania tekstu, więc jest możliwe, że w metodzie uencode lepiej będzie użyć '\\ u' oprócz '\\\\ u'. Spróbuj.
źródło
char c = (char) 0x2202; Ciąg s = "" + c;
źródło
(ODPOWIEDŹ JEST W DOT NET 4.5, aw java musi istnieć podobne podejście)
Pochodzę z Bengalu Zachodniego w Indiach. Jak rozumiem, Twoim problemem jest ... Chcesz utworzyć podobny do „অ” (jest to litera w języku bengalskim), który ma Unicode HEX:
0X0985
.Teraz, jeśli znasz tę wartość w odniesieniu do swojego języka, to w jaki sposób utworzysz symbol Unicode dla tego języka, prawda?
W Dot Net jest to takie proste:
Teraz x jest twoją odpowiedzią. Ale to jest konwersja HEX przez HEX, a zamiana zdania na zdanie to praca dla badaczy: P
źródło