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();
Ich glaube, es gibt viele gute Artikel darüber im Internet, aber hier ist eine kurze Zusammenfassung.
Sowohl UTF-8 als auch UTF-16 sind Kodierungen 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.
Haupt-UTF-8-Profis:
Haupt-UTF-8-Nachteile:
Haupt-UTF-16-Profis:
char
als Grundkomponente der zulässt Zeichenfolge.Haupt-UTF-16-Nachteile:
Im Allgemeinen ist UTF-16 für die Darstellung im Speicher besser, da BE/LE dort irrelevant ist (verwenden Sie einfach die native Reihenfolge) und die Indizierung schneller ist (vergessen Sie nur nicht, die Ersatzpaare richtig zu behandeln). UTF-8 hingegen eignet sich hervorragend für Textdateien und Netzwerkprotokolle, da es kein BE/LE-Problem gibt und eine Nullterminierung häufig nützlich ist sowie ASCII-Kompatibilität bietet.
Es sind einfach verschiedene Schemata zur Darstellung von Unicode-Zeichen.
Beide sind variabel lang - UTF-16 verwendet 2 Byte 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 Byte für Zeichen im aktuellen Unicode-Bereich von U + 0000 bis U + 1FFFFF und ist erweiterbar auf U + 7FFFFFFF, falls dies jemals erforderlich wird ... Insbesondere werden jedoch alle ASCII - Zeichen in jeweils einem Byte dargestellt.
Für die Zwecke eines Nachrichten-Digests spielt es keine Rolle, welche davon Sie auswählen, solange jeder, der versucht, den Digest neu zu erstellen, dieselbe Option verwendet.
Weitere Informationen zu UTF-8 und Unicode finden Sie unter diese Seite .
(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.)
Dies hat nichts mit UTF-8/16 zu tun (im Allgemeinen, obwohl es in UTF16 konvertiert wird und der BE/LE-Teil mit einer einzelnen Zeile festgelegt werden kann). Im Folgenden wird jedoch die schnellste Methode zum Konvertieren von String in Byte [] beschrieben. Zum Beispiel: gut genau für den angegebenen Fall (Hash-Code). String.getBytes (enc) ist relativ langsam.
static byte[] toBytes(String s){
byte[] b=new byte[s.length()*2];
ByteBuffer.wrap(b).asCharBuffer().put(s);
return b;
}
Unterschied zwischen UTF-8 und UTF-16? Warum brauchen wir diese?
In Implementierungen von TF-16 sind mindestens einige Sicherheitslücken aufgetreten. Siehe Wikipedia für Details .
WHATWG und W3C haben jetzt deklariert dass nur TF-8 ist im Web verwendet werden.
Die hier beschriebenen [Sicherheit] -Probleme verschwinden, wenn ausschließlich UTF-8 verwendet wird. Dies ist einer der vielen Gründe, aus denen jetzt die obligatorische Kodierung für alle Dinge erfolgt.
Andere Gruppen sagen dasselbe.
Während UTF-16 möglicherweise weiterhin intern von einigen Systemen wie Java und Windows verwendet wird, kann es sein, dass Sie in der Vergangenheit nur wenig UTF-16 für Datendateien, den Datenaustausch usw. verwendet haben solche, wird wahrscheinlich ganz verblassen.