JavaScripts Zeichensatz:
JavaScript -Programme werden mit Unicode -Zeichensätzen geschrieben. Unicode ist ein Supersatz von ASCII und Latin-1 und unterstützt fast alle Sprachen auf der Erde. ECMAScript3 verlangt JavaScript, um Unicode 2.1 und nachfolgende Versionen zu unterstützen, während ECMAScript5 die Unterstützung von Unicode 3 und nachfolgenden Versionen erfordert. Also haben wir es geschrieben
JavaScript -Programme werden alle mit Unicode codiert.
UTF-8
UTF-8 (UTF8-Bit Unicode-Transformationsformat) ist ein Zeichen für variable Länge für Unicode und auch ein Präfixcode.
Es kann verwendet werden, um jedes Zeichen im Unicode -Standard darzustellen, und das erste Byte in seiner Codierung ist immer noch mit ASCII kompatibel, was es für Software ermöglicht, die ursprünglich ASCII -Zeichen behandelt, um weiterhin zu verwenden oder eine kleine Änderung zu erfordern. Daher wurde es allmählich zur bevorzugten Codierung in E -Mails, Webseiten und anderen Anwendungen zum Speichern oder Senden von Text.
Die meisten Websites verwenden derzeit die UTF-8-Codierung.
Konvertieren Sie die von JavaScript generierte Unicode-kodierte Zeichenfolge in die utf-8 codierte Zeichenfolge
Wie im Titel erwähnt, ist das Anwendungsszenario sehr häufig. Wenn Sie beispielsweise eine Binärdatei an den Server senden, sieht der Server fest, dass die Codierung des binären Inhalts UTF-8 sein muss. In diesem Fall müssen wir die Unicode-Zeichenfolge von JavaScript in eine UTF-8-codierte Zeichenfolge über das Programm konvertieren.
Konvertierungsmethode
Vor der Konvertierung müssen wir verstehen, dass die Kodierungsstruktur von Unicode festgelegt ist.
Wenn Sie es nicht glauben, können Sie die CharCodeat -Methode der String ausprobieren, um zu sehen, wie viele Bytes der zurückgegebene Wurkode aufnimmt.
• Englisch nimmt 1 Charakter ein und chinesische Charaktere nimmt 2 Zeichen ein
Die Länge der Codierungsstruktur von UTF-8 wird jedoch durch die Größe eines einzelnen Zeichens bestimmt.
Unten ist die Größe eines einzelnen Zeichens, das mehrere Bytes aufnimmt. Die maximale Länge nach einem einzelnen Unicode -Zeichen beträgt 6 Bytes.
• 1 Byte: Der Unicode -Code ist 0 - 127
• 2 Bytes: Der Unicode -Code ist 128 - 2047
• 3 Bytes: Der Unicode -Code ist 2048 - 0xffff
• 4 Bytes: Der Unicode -Code ist 65536 - 0x1fffff
• 5 Bytes: Der Unicode -Code ist 0x200000 - 0x3ffffff
• 6 Bytes: Der Unicode -Code ist 0x4000000 - 0x7fffffffff
Einzelheiten finden Sie im Bild:
Da die Unicode -Codes von englischen und englischen Zeichen 0 - 127 sind, sind die Länge und Bytes von Englisch in Unicode und UTF -8 gleich und belegen nur 1 Byte. Deshalb ist UTF8 ein Superet von Unicode!
Lassen Sie uns nun chinesische Zeichen diskutieren, da das Unicode -Code -Intervall chinesischer Zeichen 0x2e80 - 0x9fff ist, sodass die Länge der chinesischen Zeichen in UTF8 bis zu 3 Bytes beträgt.
Wie konvertieren chinesische Zeichen von 2 Bytes Unicode in drei Bytes von UTF8?
Angenommen, ich muss den chinesischen Charakter "中" in UTF-8-Codierung umwandeln
1. Holen Sie sich die Unicode -Wertgröße der chinesischen Zeichen
var str = 'in'; var charCode = str.charCodeat (0); console.log (CharCode); // => 20013
2. Beurteilen Sie die Länge von UTF8 basierend auf der Größe
Aus dem vorherigen Schritt erhalten wir den Wurstwaren des chinesischen Charakters "in" Is 20013. Dann stellen wir fest, dass sich 20013 im Intervall 2048 - 0xffff befindet, sodass der chinesische Charakter "in" 3 Bytes in UTF8 besetzen sollte.
3.. Komplement
Da wir wissen, dass der chinesische Charakter "Ich" 3 Bytes besetzen muss, wie können wir diese 3 Bytes bekommen?
Dies erfordert das Entwerfen des Komplementcode. Die spezifische Komplement -Code -Logik lautet wie folgt:
Ok, ich weiß, dass Sie dieses Bild nicht verstehen können, also werde ich einfach darüber sprechen!
Der spezifische Füllcode lautet wie folgt, "x" zeigt den leeren Speicherplatz an, der zum Füllen verwendet wird.
• 0xxxxxxx
• 110xxxxx 10xxxxxx
• 1110xxxx 10xxxxxx 10xxxxxx
• 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxx
• 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
• 1111110X 10xxxxxx 10xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxxxxxx
Warnung: Hast du es gefunden? Das erste Byte des Fill-Code gibt an, wie viele Bytes der gesamte UTF-8-Code einnimmt! Diese Funktion wird von UTF-8 verwendet, der zu unicode ~ decodiert ist
Lassen Sie uns zuerst ein einfaches Beispiel geben. Konvertieren Sie den englischen Buchstaben "A" in Utf8 Codierung.
1. Der Charcode von "a" ist 65
2. 65 befindet sich im Intervall zwischen 0 und 127, also nimmt "a" ein Byte ein
3. Die Komplement von einem Byte in UTF8 beträgt 0xxxxxxx. X repräsentiert eine freie Position und wird zum Komplement verwendet.
4. Konvertieren Sie 65 in Binary, um 1000001 zu erhalten
5. 1000001 zu den offenen Stellen von 1xxxxxxx von vorne nach hinten und erhalten Sie 01000001
6. Konvertieren Sie 11000001 in eine Zeichenfolge, um "a" zu bekommen
7. Schließlich wird "a" von UTF8 codiert.
In diesem kleinen Beispiel haben wir erneut verifiziert, dass UTF-8 ein Superet von Unicode ist!
Okay, lass uns zum chinesischen Charakter "Mitte" zurückkehren. Früher haben wir den Charcode von "Middle" als 20013 und die Binärdatei ist 010011100 00101101. Die Details sind wie folgt:
var code = 20013; code.toString (2); // => 10011100101 entspricht 01001110 00101101
Anschließend folgen wir der Methode eines "A", das das oben genannte ausfüllt, um die Position auszufüllen.
Komplement 01001110 00101101 In der Reihenfolge von vorne nach zurück zu 1110xxxxx 10xxxxxx 10xxxxxx. Holen Sie sich 11100100 10111000 10101101.
4. Erhalten Sie UTF8 -Codierte Inhalte
In den obigen Schritten erhalten wir drei UTF8 -Bytes von "in", 11100100 10111000 1010110101.
Wir konvertieren jedes Byte in Hexadezimal und erhalten 0xE4 0xB8 0xad;
Dann ist dieser 0xe4 0xb8 0xad die UTF8 -Codierung, die wir endlich erhalten haben.
Wir verwenden einen NodeJS -Puffer, um zu überprüfen, ob er korrekt ist.
var buffer = new buffer ('in'); console.log (buffer.length); // => 3console.log (Puffer); // => <Buffer E4 B8 AD> // Endlich drei Bytes 0xe4 0xb8 0xad erhaltenWeil Hexadezimal fallfrei ist, ist es genau das gleiche, wie wir es berechnet haben, dass 0xe4 0xb8 0xad?
Schreiben Sie die obige Codierungslogik in eine Funktion.
// formatieren Sie die Zeichenfolge in utf8-codierte Bytes var writeUutf = Funktion (str, isgetBytes) {var back = []; var bytesize = 0; für (var i = 0; i <str.length; i ++) {var code = str.charCodeat (i); if (0x00 <= code && code <= 0x7f) {bytesize += 1; zurück.push (Code); } else if (0x80 <= code && code <= 0x7ff) {bytesize += 2; back.push ((192 | (31 & (Code >> 6))))); back.push ((128 | (63 & code))} else if ((0x800 <= Code && Code <= 0xd7ff) || (0xe000 <= Code && Code <= 0xffff)) {bytesize += 3; Back.push ((224 | (15 & (Code >> 12)))); Back.push ((128 | (63 & (Code >> 6)))); back.push ((128 | (63 & code))}} für (i = 0; i <zurück.length; i ++) {zurück [i] & = 0xff; } if (isGetBytes) {return zurück} if (bytesize <= 0xff) {return [0, bytesize] .Concat (zurück); } else {return [bytesize >> 8, bytesize & 0xff] .concat (zurück); }} writeutf ('in-on'); // => [0, 3, 228, 184, 173] // Die ersten beiden Ziffern repräsentieren die Länge der nachfolgenden UTF8 -Bytes. Da die Länge 3 beträgt, sind die ersten beiden Bytes "0, 3" // Der Inhalt beträgt 228, 184, 173 "und ist in Hexadezimal konvertiert. 0xE4 0xB8 0xad` ist // les utf8-codierte Bytes lesen und speziell für Unicode's String var readutf = function (arr) {if (typeof arr === 'String') {return arr; } var utf = '', _arr = this.init (arr); für (var i = 0; i <_arr.length; i ++) {var One = _arr [i] .ToString (2), v = ein.match (/^1+? (? = 0)/); if (v && one.length == 8) {var bytesLength = v [0] .Length; var store = _arr [i] .toString (2) .lice (7 - bytesLength); für (var st = 1; st <bytesLength; st ++) {spec += _arr [st +i] .toString (2) .lice (2)} utf += string.fromCharCode (parseInt (specy, 2)); i += bytesLength - 1} else {utf += string.fromCharCode (_arr [i])}} return utf} readutf ([0, 3, 228, 184, 173]); => 'In'Eine andere Methode, um Chinesisch zu analysieren, um UTF8 -Bytecode zu erhalten
Eine weitere relativ einfache Methode, um Chinesen in UTF8 -Bytecode umzuwandeln, ist relativ einfach. Der Browser bietet auch eine Methode, und jeder hat diese Methode verwendet. Was ist das? Es ist Encodeuri. Natürlich ist Encodeuricomponent auch in Ordnung.
Das ist richtig, das ist die Methode. Wie konvertiert diese Methode ein von Unicodecoded Chinese in UTF8-Bytecode?
var str = ''; var code = cododeuri (str); console.log (Code); // =>%E4%B8%Anzeige
Haben Sie festgestellt, dass ich eine entkommene Zeichenfolge erhalten habe und der Inhalt in dieser Zeichenfolge den gleichen wie der Bytecode ist, den ich zuvor oben bekommen habe.
Als nächstes wandeln wir%E4%B8%AD in ein Zahlenarray um.
var codelist = code.split ('%'); codelist = codelist.map (item => parseInt (item, 16)); console.log (codelist); // => [228, 184, 173]So einfach, gibt es irgendetwas ~~~
Was ist das Prinzip dieser einfachen Methode?
Hier ist das Problem der QueryString -Codierung in URIs. Denn nach den Vorschriften muss QueryString in URI gemäß der UTF8 -Codierung übertragen werden, und JavaScript ist Unicode, sodass der Browser uns eine Methode zur Verfügung stellt, dh die cododeuri/encodeuricomponent -Methode. Diese Methode wird erklärt
Nicht englische Charaktere (dies wird in Betracht gezogen, warum nicht englische Charaktere?
Nun, das sind alle Prinzipien, sonst nichts.
Diese Methode hat jedoch einen weiteren Nachteil, dh sie entkommen nur nicht englischen Charakteren. Wenn wir also die englischen Charaktere in UTF8-Codierung formatieren müssen, kann diese Methode unsere Bedürfnisse nicht erfüllen, und wir müssen auch den englischen Charakteren entkommen.
Was soll ich tun, wenn ich es analysieren möchte? Verwenden Sie einfach Decodeuri/Decodeuricomponent.
var codelist = [228, 184, 173]; var code = codelist.map (item => '%'+item.toString (16)). join (''); decodeuri (Code); // =>Okay, in diesem Artikel wird die UTF8 -Codierung eingeführt.
Ich hoffe, es kann Ihnen helfen, die Prinzipien der UTF-8-Codierung zu verstehen.
Das obige sind alle Implementierungsmethoden für die UTF-8-Codierung durch JavaScript, die Ihnen gebracht wurde. Ich hoffe, jeder wird Wulin.com mehr unterstützen ~