Unterschied zwischen UTF-8 und UTF-16? Warum brauchen wir diese?
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();
Antworten:
Ich glaube, es gibt viele gute Artikel darüber im Web, aber hier ist eine kurze Zusammenfassung.
Sowohl UTF-8 als auch UTF-16 sind Codierungen mit variabler Länge. In UTF-8 kann ein Zeichen jedoch mindestens 8 Bit belegen, während in UTF-16 die Zeichenlänge mit 16 Bit beginnt.
Hauptprofis von UTF-8:
Haupt-UTF-8-Nachteile:
Hauptprofis von UTF-16:
char
als primitive Komponente der Zeichenfolge ermöglicht.Haupt-UTF-16-Nachteile:
Im Allgemeinen ist UTF-16 für die In-Memory-Darstellung besser geeignet, da BE / LE dort irrelevant ist (nur native Reihenfolge verwenden) und die Indizierung schneller ist (vergessen Sie nur nicht, Ersatzpaare richtig zu behandeln). UTF-8 hingegen eignet sich hervorragend für Textdateien und Netzwerkprotokolle, da es kein BE / LE-Problem gibt und die Nullterminierung häufig nützlich ist sowie die ASCII-Kompatibilität.
quelle
Es sind einfach verschiedene Schemata zur Darstellung von Unicode-Zeichen.
Beide sind variabel lang - UTF-16 verwendet 2 Bytes für alle Zeichen in der mehrsprachigen Basisebene (BMP), die die meisten häufig verwendeten Zeichen enthält.
UTF-8 verwendet zwischen 1 und 3 Byte für Zeichen im BMP, bis zu 4 für Zeichen im aktuellen Unicode-Bereich von U + 0000 bis U + 1FFFFF und ist auf U + 7FFFFFFF erweiterbar, falls dies jemals erforderlich wird ... Insbesondere werden jedoch alle ASCII-Zeichen jeweils in einem Byte dargestellt.
Für die Zwecke eines Nachrichtenauszugs spielt es keine Rolle, welche davon Sie auswählen, solange jeder, der versucht, den Auszug neu zu erstellen, dieselbe Option verwendet.
Auf dieser Seite finden Sie weitere Informationen zu UTF-8 und Unicode.
(Beachten Sie, dass alle Java-Zeichen UTF-16-Codepunkte innerhalb des BMP sind. Um Zeichen über U + FFFF darzustellen, müssen Sie in Java Ersatzpaare verwenden.)
quelle
Sicherheit: Verwenden Sie nur UTF-8
Bei der Implementierung von UTF-16 gab es mindestens einige Sicherheitslücken . Siehe Wikipedia für Details .
WHATWG und W3C haben jetzt erklärt, dass nur UTF-8 im Web verwendet werden soll.
Andere Gruppen sagen dasselbe.
Während UTF-16 möglicherweise weiterhin intern von einigen Systemen wie Java und Windows verwendet wird, wird die geringe Verwendung von UTF-16, die Sie in der Vergangenheit möglicherweise für Datendateien, Datenaustausch usw. gesehen haben, wahrscheinlich vollständig verschwinden.
quelle
Dies hat nichts mit UTF-8/16 zu tun (obwohl es in UTF16 konvertiert wird und der BE / LE-Teil mit einer einzelnen Zeile festgelegt werden kann), ist unten der schnellste Weg, um String in Byte [] zu konvertieren. Zum Beispiel: gut genau für den angegebenen Fall (Hash-Code). String.getBytes (enc) ist relativ langsam.
quelle
Eine einfache Möglichkeit, UTF-8 und UTF-16 zu unterscheiden, besteht darin, Gemeinsamkeiten zwischen ihnen zu identifizieren.
Abgesehen davon, dass für ein bestimmtes Zeichen dieselbe Unicode-Nummer verwendet wird, hat jedes sein eigenes Format.
quelle