Eine nette und schnelle Hack ist eine Kombination aus encodeURI und unescape zu verwenden:
t=[];
for(s=unescape(encodeURI("zażółć gęślą jaźń")),i=0;i<s.length;++i)
t.push(s.charCodeAt(i));
t
[122, 97, 197, 188, 195, 179, 197, 130, 196, 135, 32, 103, 196, 153, 197, 155, 108, 196, 133, 32, 106, 97, 197, 186, 197, 132]
Vielleicht eine Erklärung notwendig ist, warum die Heck es funktioniert, so lassen sie es mich in einzelne Schritte aufgeteilt:
encodeURI("zażółć gęślą jaźń")
kehrt
"za%C5%BC%C3%B3%C5%82%C4%87%20g%C4%99%C5%9Bl%C4%85%20ja%C5%BA%C5%84"
die - wenn Sie genau hinsehen - die ursprüngliche Zeichenfolge ist, in der alle Zeichen mit Werten> 127 durch (möglicherweise mehr als) hexadezimale Byte-Darstellungen ersetzt wurden. Zum Beispiel wurde der Buchstabe "ż" zu "% C5% BC". Tatsache ist, dass encodeURI auch einige normale Ascii-Zeichen wie Leerzeichen entzieht, aber das macht nichts. Es kommt darauf an, dass an dieser Stelle jedes Byte der ursprünglichen Zeichenfolge entweder wörtlich (wie bei "z", "a", "g" oder "j") oder als prozentcodierte Bytefolge (wie es bei "ż" der Fall war, der ursprünglich zwei Bytes 197 und 188 war und in% C5 und% BC umgewandelt wurde. Jetzt
wenden wir unescape:
unescape("za%C5%BC%C3%B3%C5%82%C4%87%20g%C4%99%C5%9Bl%C4%85%20ja%C5%BA%C5%84")
die
"zażóÅÄ gÄÅlÄ jaźÅ"
gibt Wenn Sie nicht heimisch sind polnische Lautsprecher Sie vielleicht nicht bemerken, dass dieses Ergebnis in der Tat ist viel anders als das Original " zażółć gęślą jaźń ". Für den Anfang hat es eine andere Anzahl von Charakteren :) Sicher können Sie sagen, dass diese seltsamen Versionen von Großbuchstabe A nicht zum Standard-ASCII-Set gehören. Tatsächlich hat dieses "Å" den Wert 197. (was genau hexadezimal C5 ist).
Nun, wenn Sie wie ich sind, würden Sie sich fragen: Warten Sie eine Minute ... Wenn dies wirklich eine Folge von Bytes mit den Werten 122, 97, 197, 188 ist, und JS wirklich UTF dann warum verwenden Ich sehe diese "ż" -Zeichen und nicht das Original "ż"?
Nun, die Sache (ich glaube), dass diese Sequenz 122, 97, 197, 188 (die wir sehen, wenn die Anwendung charCodeAt) ist nicht eine Folge von Bytes, sondern eine Folge von Codes. Das Zeichen "Å" hat einen Code 197, aber seine eigentlich zwei Byte lange Sequenz: C3 85.
Also funktioniert der Trick, weil unescape Zahlen behandelt, die in Prozent-kodierten Strings als Codes auftreten, nicht als Byte-Werte - oder Um genauer zu sein: Unescape weiß nichts über Multibyte-Zeichen, also wenn man Bytes byteweise decodiert, sind Werte von weniger als 128 einfach großartig, aber nicht so gut, wenn sie in solchen Fällen über 127 und Multibyte liegen gibt einfach ein Multibyte-Zeichen zurück, das zufällig einen Code aufweist, der dem angeforderten Bytewert entspricht. Dieser "Bug" ist eigentlich eine nützliche Funktion.
Können Sie ein Beispiel geben? – Gumbo
ASCII hat * NO * Werte> 128 (eigentlich hat es keine Werte> 127: es definiert NUR Codes zwischen 0 und 127). Die Frage nach "ASCII-Werten> 128" macht also keinen Sinn; Sie müssen eine andere Zeichencodierung meinen (ISO-8859-x für einen Wert von x, vielleicht?) –
Es gibt erweiterte ASCII-Codes (von 128 bis 255) http://www.asciitable.com/ –