Rozważmy następujący kod:Obchodzenie się wartości zastępcze Unicode w ciągi Java
byte aBytes[] = { (byte)0xff,0x01,0,0,
(byte)0xd9,(byte)0x65,
(byte)0x03,(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,
(byte)0x17,(byte)0x33, (byte)0x74, (byte)0x6f,
0, 1, 2, 3, 4, 5,
0 };
String sCompressedBytes = new String(aBytes, "UTF-16");
for (int i=0; i<sCompressedBytes.length; i++) {
System.out.println(Integer.toHexString(sCompressedBytes.codePointAt(i)));
}
Pobiera następujące nieprawidłowe wyjście:
ff01, 0, fffd, 506, 717, 3374, 6f00, 102, 304, 500.
Jednakże, jeśli 0xd9
w danych wejściowych zmienia się na 0x9d
, a następnie uzyskano następujące prawidłowe wyniki:
ff01, 0, 9d65, 304, 506, 717, 3374, 6f00, 102, 304, 500.
I reali ze ta funkcjonalność wynika z faktu, że bajt 0xd9
jest znacznikiem surogatowym Unicode.
Pytanie: Czy istnieje sposób na podawanie, identyfikowanie i wyodrębnianie bajtów zastępczych (0xd800
do 0xdfff
) w ciągu znaków Unicode Java?
Dzięki
Uważam, że masz rację. Właśnie doszedłem do tego samego wniosku, ale sprawdziłem, czy ktoś jeszcze bardziej kompetentny już odpowiedział. –
Po prostu wstawiając "(bajt) 0xdc, (bajt) 0xef," daje "ff01 694ef dcef ..." Tak jak być powinno. –
Dziękuję za odpowiedzi. Ale problem nie polega na osadzaniu zastępczych postaci. Wymagane jest przekazywanie dowolnych sekwencji bajtów (które są wyprowadzane z kompresji) do ciągu Java i odczytywanie go jako równoważnej sekwencji bajtów. –