G-Clef (U + 1D11E) nie jest częścią Basic Multilingual Plane (BMP), co oznacza, że wymaga więcej niż 16 bitów. Prawie wszystkie funkcje odczytu języka Java zwracają tylko wartość char
lub int
zawierającą również only 16 bit. Która funkcja odczytuje pełne symbole Unicode, w tym SMP, SIP, TIP, SSP i PUA?Jak odczytać kod Unicode G-Clef (U + 1D11E) z pliku?
Aktualizacja
mam pytanie jak czytać pojedynczy symbol Unicode (lub punkt kodu) ze strumienia wejściowego. Nie mam żadnej tablicy całkowitej ani nie chcę czytać linii.
Możliwe jest zbudowanie punktu kodowego z Character.toCodePoint()
, ale ta funkcja wymaga char
. Z drugiej strony czytanie char
nie jest możliwe, ponieważ read()
zwraca int
. Moja najlepsza dotychczasowa praca jest taka, ale nadal zawiera niebezpieczne rzuty:
public int read_code_point (Reader input) throws java.io.IOException
{
int ch16 = input.read();
if (Character.isHighSurrogate((char)ch16))
return Character.toCodePoint((char)ch16, (char)input.read());
else
return (int)ch16;
}
Jak to zrobić lepiej?
Aktualizacja 2
Inna wersja powrocie String ale wciąż przy odlewane:
public String readchar (Reader input) throws java.io.IOException
{
int i16 = input.read(); // UTF-16 as int
if (i16 == -1) return null;
char c16 = (char)i16; // UTF-16
if (Character.isHighSurrogate(c16)) {
int low_i16 = input.read(); // low surrogate UTF-16 as int
if (low_i16 == -1)
throw new java.io.IOException ("Can not read low surrogate");
char low_c16 = (char)low_i16;
int codepoint = Character.toCodePoint(c16, low_c16);
return new String (Character.toChars(codepoint));
}
else
return Character.toString(c16);
}
Pozostała kwestia: czy opatrunki bezpieczny i jak ich uniknąć?
Nie ma potrzeby, aby dodać główną tag w tytule. –
możliwy duplikat [czytania w języku Java w strumieniach znaków z dodatkowymi znakami Unicode] (http://stackoverflow.com/questions/7721293/java-reading-in-character-streams-w-suplement- tuned-characters) –
Możliwy duplikat nie zawiera odpowiedzi. – ceving