Różnica między UTF-8 i UTF-16? Dlaczego tego potrzebujemy?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Odpowiedzi:
Wydaje mi się, że w Internecie jest wiele dobrych artykułów na ten temat, ale oto krótkie podsumowanie.
Zarówno UTF-8, jak i UTF-16 to kodowania o zmiennej długości. Jednak w UTF-8 znak może zajmować minimum 8 bitów, podczas gdy w UTF-16 długość znaku zaczyna się od 16 bitów.
Główne zalety UTF-8:
Główne wady UTF-8:
Główne zalety UTF-16:
char
jako pierwotnego składnika ciągu.Główne wady UTF-16:
Ogólnie rzecz biorąc, UTF-16 jest zwykle lepszy do reprezentacji w pamięci, ponieważ BE / LE nie ma tam znaczenia (po prostu użyj kolejności natywnej), a indeksowanie jest szybsze (tylko nie zapomnij o prawidłowej obsłudze par zastępczych). Z drugiej strony UTF-8 jest wyjątkowo dobry w przypadku plików tekstowych i protokołów sieciowych, ponieważ nie ma problemu z BE / LE i często przydaje się zakończenie zerowe, a także kompatybilność z ASCII.
źródło
Są to po prostu różne schematy reprezentowania znaków Unicode.
Oba mają zmienną długość - UTF-16 wykorzystuje 2 bajty na wszystkie znaki w podstawowej płaszczyźnie wielojęzycznej (BMP), która zawiera większość powszechnie używanych znaków.
UTF-8 wykorzystuje od 1 do 3 bajtów dla znaków w BMP, do 4 dla znaków w obecnym zakresie Unicode od U + 0000 do U + 1FFFFF i można go rozszerzyć do U + 7FFFFFFF, jeśli zajdzie taka potrzeba ... ale przede wszystkim wszystkie znaki ASCII są reprezentowane w jednym bajcie.
Na potrzeby podsumowania wiadomości nie ma znaczenia, który z nich wybierzesz, o ile każdy, kto próbuje odtworzyć podsumowanie, korzysta z tej samej opcji.
Zobacz tę stronę, aby uzyskać więcej informacji na temat UTF-8 i Unicode.
(Zauważ, że wszystkie znaki Java są punktami kodowymi UTF-16 w BMP; aby przedstawić znaki powyżej U + FFFF, musisz użyć par zastępczych w Javie.)
źródło
Bezpieczeństwo: używaj tylko UTF-8
W implementacjach UTF-16 było co najmniej kilka luk w zabezpieczeniach . Szczegółowe informacje można znaleźć w Wikipedii .
WHATWG i W3C są teraz ogłosił , że tylko UTF-8 ma być używany w sieci.
Inne grupy mówią to samo.
Tak więc, podczas gdy UTF-16 może nadal być używany wewnętrznie przez niektóre systemy, takie jak Java i Windows, to niewielkie wykorzystanie UTF-16, które mogłeś widzieć w przeszłości do plików danych, wymiany danych itp., Prawdopodobnie zniknie całkowicie.
źródło
Nie ma to związku z UTF-8/16 (generalnie, chociaż konwertuje do UTF16, a część BE / LE można ustawić w jednej linii), ale poniżej znajduje się najszybszy sposób konwersji String na bajt []. Na przykład: dobre dokładnie dla podanego przypadku (kod skrótu). String.getBytes (enc) jest stosunkowo powolny.
źródło
Prostym sposobem na rozróżnienie UTF-8 i UTF-16 jest zidentyfikowanie podobieństw między nimi.
Poza tym, że mają ten sam numer Unicode dla danego znaku, każdy ma swój własny format.
źródło