Wyobrażam sobie, że powodem był szybki, podobny do tablicy dostęp do znaku w indeksie, ale niektóre znaki nie mieszczą się w 16 bitach, więc nie działałoby ...
Jeśli więc i tak musisz poradzić sobie ze specjalnymi przypadkami, dlaczego nie skorzystać z UTF-8?
Odpowiedzi:
Ponieważ kiedyś był to UCS-2 , który był ładnym 16-bitowym bitem o stałej długości. Oczywiście 16-bitowe nie wystarczyło. Zainstalowali UTF-16 na górze.
źródło
Originally, Unicode was designed as a pure 16-bit encoding, aimed at representing all modern scripts. (Ancient scripts were to be represented with private-use characters.) Over time, and especially after the addition of over 14,500 composite characters for compatibility with legacy sets, it became clear that 16-bits were not sufficient for the user community. Out of this arose UTF-16.
w momencie wydania Java UTF-16 jeszcze się nie pojawił, a UTF-8 nie był częścią standardu Unicode.Zasadniczo, ze względu na proste i proste zabezpieczenie na przyszłość. To, czy był to błędny powód i zły sposób postępowania, to inna kwestia.
W tym dokumencie można znaleźć powody niektórych decyzji projektowych dotyczących przejścia na Javę 5 i UTF-16 w 2004 r., Co wyjaśnia także niektóre niedociągnięcia: Postacie uzupełniające na platformie Java i zobacz, dlaczego ekosystem Java używa różne kodowania w całym stosie? .
Aby uzyskać więcej informacji na temat pułapek używania UTF-16 i dlaczego UTF-8 jest ogólnie lepszą opcją, zobacz Czy UTF-16 należy uważać za szkodliwy? oraz manifest UTF-8 Everywhere .
źródło
string
„specjalnego” typu w Javie (podobnie jakArray
jest), zamiastString
bycia „zwykłą” klasą, która zawiera odniesienie do „zwykłej” tablicy zawierającej rzeczywiste znaki. W zależności od tego, jak generowany jest ciąg, UTF-8, UTF-16, a nawet UTF-32 mogą być najbardziej efektywnym sposobem przechowywania go. Nie sądzę, aby istniał jakikolwiek szczególnie wydajny sposób „zwykłej” klasyString
do obsługi wielu formatów, ale mógłby to zrobić „specjalny” typ z obsługą JVM.