Dlaczego Java używa UTF-16 do wewnętrznej reprezentacji ciągu?

29

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?

mrpyo
źródło
4
O coś zapytać projektantów Java, a nie całą społeczność. Głosowanie na zakończenie nie jest konstruktywne.
Oded
16
@Oded: absolutnie nieuzasadnione, jak pokazuje odpowiedź DeadMG.
Michael Borgwardt,
Jestem zdezorientowany: byłem prawie pewien, że na to pytanie już udzielono odpowiedzi (zarówno tutaj, jak i na SO), ale nie mogę znaleźć duplikatów.
Joachim Sauer
Dla histerycznych rodzynek. Zobacz utf8everywhere.org
Pavel Radzivilovsky

Odpowiedzi:

47

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.

DeadMG
źródło
6
Oto cytat z FAQ na temat Unicode : 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.
Malcolm,
20
UCS-2 jest terminem technicznym, a nie modnym słowem.
DeadMG,
14

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 .

Haylem
źródło
8
+1 za link do „Czy UTF-16 należy uważać za szkodliwy?” pytanie. Niedawno odkryłem manifest UTF-8 Everywhere i wydaje mi się, że jestem teraz całkowicie przekonany. Jeśli chodzi o to, co warto, chociaż Java pomyliła się, jestem całkiem przekonany, że Windows działał znacznie gorzej.
Daniel Pryden,
5
Cóż, nie jest zaskoczeniem, że Windows pomylił się bardziej : wcześniej przeszli na Unicode, więc mieli mniej prawidłowych wyborów i mniej doświadczenia. Java dostał później dostał to bardziej w porządku , ale nadal nieco mylić. Teraz oba muszą żyć ze starymi, niepoprawnymi w ogólnym rozumieniu interfejsami API, które muszą obsługiwać.
Joachim Sauer
4
Takie jest życie w świecie oprogramowania, musisz dokonywać wyborów bez posiadania wszystkich danych, a kiedy się mylisz, możesz długo ponosić konsekwencje. :-)
Brian Knoblauch,
2
Zastanawiam się, jakie byłyby implikacje związane z wydajnością tworzenia string„specjalnego” typu w Javie (podobnie jak Arrayjest), zamiast Stringbycia „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” klasy Stringdo obsługi wielu formatów, ale mógłby to zrobić „specjalny” typ z obsługą JVM.
supercat
@ supercat: Nie mam na to dokładnej odpowiedzi, ale mam na to powiązaną odpowiedź SO . :) Tak naprawdę nie odnosi się do specjalnego podejścia, ale omawia potencjalny zysk z usprawnienia ciągów.
haylem