Ostatnio dużo czytałem na temat kodów Unicode i ich ewolucji z czasem i jestem pewien, że przeczytałem też: http://www.joelonsoftware.com/articles/Unicode.html.Dlaczego Java char używa UTF-16?
Ale coś nie mogłem znaleźć prawdziwy powód, dla którego Java używa UTF-16 dla char.
Na przykład, jeśli miałem ciąg znaków, który zawierał 1024 litery łańcucha znaków ASCII z zakresami znaków. Oznacza to 1024 * 2 bytes
, co odpowiada pamięci ciągów o rozmiarze 2KB, które zostanie zużyte w każdym razie.
Jeśli więc Java base char byłby UTF-8, byłby to tylko 1KB danych. Nawet jeśli ciąg ma dowolną cechę, która wymaga 2 bajtów, na przykład 10 znaków "字", naturalnie zwiększy to zużycie pamięci. (1014 * 1 byte) + (10 * 2 bytes) = 1KB + 20 bytes
Rezultat nie jest tak oczywisty. 1KB + 20 bytes VS. 2KB
Nie mówię o ASCII, ale moja ciekawość, dlaczego to nie jest UTF-8, który jest po prostu dbaniem o wielobajtowe znaki. UTF-16 wygląda na stratę pamięci w dowolnym ciągu, który ma wiele znaków niebibibych.
Czy istnieje ku temu dobry powód?
Załóżmy, że chcesz uzyskać dostęp do 576. znaku ciągu i jest reprezentowany jako tablica bajtów kodowana w UTF8. Jaki jest koszt operacji? –
hmm, na pewno brakowało mi punktu przeklinania. Musi obliczyć cały bajt X, aby zdecydować, który to jest charachter. Potem postanowili poświęcić pamięć przeciwko procesorowi. – FZE
Ciągi są niezmienne - jest to możliwe (i nadal będzie możliwe doposażenie bez łamania istniejącego * kodu Java * [prawdopodobnie zrywałoby JNI]) do przechowywania łańcuchów zawierających tylko kody 0-255 w 8-bitowym kodowaniu, oraz łańcuchy z innymi kodami w 16-bitowym stylu są teraz. Ale wydaje się, że potrzeba tego nie jest bardzo wysoka (przynajmniej nie widziałem dużego zapotrzebowania na to). –