2016-04-10 3 views
8

Was ist der Unterschied zwischen String.prototype.codePointAt() und String.prototype.charCodeAt() in JavaScript ist?Unterschied zwischen codePointAt und charCodeAt

'A'.codePointAt(); // 65 
'A'.charCodeAt(); // 65 
+6

[MDN: charCodeAt] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt) - erster Absatz. – Emissary

Antwort

15

Von Mozilla:

Die charCodeAt() Methode eine ganze Zahl zwischen 0 zurückgibt und 65535, die den UTF-16 Code-Einheit bei der gegebenen Index (der UTF-16 Code-Einheit entspricht der Unicode-Code Punkt für Codepunkte darstellbar in einer einzigen UTF-16-Code-Einheit, kann aber auch die erste Codeeinheit eines Ersatzpaares sein, für die Codepunkte nicht in einer einzigen UTF-16-Code-Einheit, beispielsweise Unicode-Codepunkte> 0x10000) darstellbar. Wenn Sie den gesamten Codepunktwert verwenden möchten, verwenden Sie codePointAt().

charCodeAt() ist UTF-16, codePointAt() ist Unicode.

+0

Nur um hinzuzufügen, zeigen viele Unicode-Tabellen Hex-Werte, z. U + 00A0. Da 'codePointAt' einen int zurückgibt, können Sie ihn in hex konvertieren, indem Sie' .toString (16) 'aufrufen, wenn Sie manuell nach der Unicode-Tabelle suchen. –

5

ein paar für die ToxicTeacakes Antwort hinzuzufügen, hier ist ein weiteres Beispiel, um Ihnen den Unterschied kennen:

"".charCodeAt(0).toString(16);//d842 
"".charCodeAt(1).toString(16);//dfb7 

"".codePointAt(0);//20bb7 
"".codePointAt(1);//dfb7 

console.log("\ud842\udfb7");//, an example of hexadecimal digits 
console.log("\u20bb7\udfb7");//₻7� 
console.log("\u{20bb7}");// an unicode code point escapes the "\ud842\udfb7" 

The following ist die Info über JavaScript Stringliterale:

"\ uXXXX"
Die von den vier hexadezimal angegebenen Unicode-Zeichen Ziffern XXXX. Zum Beispiel ist \ u00A9 die Unicode-Sequenz für das Copyright-Symbol .

"\ u {} XXXXX"
Unicode-Codepunkt
entweicht. Zum Beispiel \ u {2F804} ist das gleiche wie die einfache Unicode \ uD87E \ uDC04 entweicht.

siehe auch msdn

+0

Tolles Beispiel, genau das, was ich gesucht habe! Ein paar Fragen: (i) Wissen Sie, warum 'codePointAt (1)' einen Wert zurückgibt, wenn die 'codePointAt (0)' die „ganze“ Codepunkt erfasst? (ii) Weißt du, wie 'toLowerCase()' vs 'toLocaleLowercase()' passt hier? Haben Zeichensätze wie die in Ihrer Antwort auch Groß-/Kleinschreibung? –

+0

Ich denke es liegt daran, dass es immer noch von 16 Bits indiziert ist. Der Index ist also der gleiche Index, interpretiert von 'String.prototype.charAt' und' String.prototype.charCodeAt'. [Wenn an der angegebenen Position kein Element vorhanden ist, wird undefined zurückgegeben. Wenn kein UTF-16-Ersatzpaar an po beginnt, wird die Code-Einheit an Pos zurückgegeben.] (Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt#Description). So bei Index 1, das 16. Bit, gibt es keine [Ersatzpaar] (https://en.wikipedia.org/wiki/UTF-16#Examples) im Indexbereich [1,2], so wird es das gebrochene Zeichen " \ udfb7 "(" ") – dosentmatter