Les caractères dans une chaîne de caractères sont indexés de gauche à droite. L'indice du premier caractère est 0, et l'indice du dernier caractère dans une chaîne de caractères appelée str est str.length - 1.
Les points de code Unicode vont de 0 à 1114111 (0x10FFFF). charCodeAt() retourne toujours une valeur inférieure à 65536, car les points de code plus élevés sont représentés par une paire de pseudo-caractères sur 16 bits appelés substituts. Par conséquent, pour obtenir un caractère complet dont la valeur est supérieure à 65535, il est nécessaire de récupérer non seulement charCodeAt(i), mais aussi charCodeAt(i + 1) (comme si l'on manipule une chaîne de caractères qui a deux caractères), ou d'utiliser codePointAt(i) à la place. Pour plus d'informations sur Unicode, voir Caractères UTF-16, points de code Unicode et groupes de graphèmes.
L'exemple suivant retourne 65, la valeur Unicode de A.
js
"ABC".charCodeAt(0); // retourne 65
charCodeAt() peut retourner des substituts isolés, qui ne sont pas des caractères Unicode valides.
js
const chaine = "𠮷𠮾";
console.log(chaine.charCodeAt(0)); // 55362, ou d842, qui n'est pas un caractère Unicode valide
console.log(chaine.charCodeAt(1)); // 57271, ou dfb7, qui n'est pas un caractère Unicode valide
Pour obtenir le point de code Unicode complet à l'indice donné, utilisez String.prototype.codePointAt().
js
const chaine = "𠮷𠮾";
console.log(chaine.codePointAt(0)); // 134071
Note :
Évitez de réimplémenter codePointAt() en utilisant charCodeAt(). La conversion des substituts UTF-16 en points de code Unicode est complexe, et codePointAt() peut être plus performant, car il utilise directement la représentation interne de la chaîne de caractères. Installez une prothèse d'émulation pour codePointAt() si nécessaire.
Voici un algorithme possible pour convertir une paire d'unités de code UTF-16 en un point de code Unicode, adapté de la FAQ Unicode (angl.) :
js
// constantes
const LEAD_OFFSET = 0xd800 - (0x10000 >> 10);
const SURROGATE_OFFSET = 0x10000 - (0xd800 << 10) - 0xdc00;
function utf16ToUnicode(lead, trail) {
return (lead << 10) + trail + SURROGATE_OFFSET;
}
function unicodeToUTF16(codePoint) {
const lead = LEAD_OFFSET + (codePoint >> 10);
const trail = 0xdc00 + (codePoint & 0x3ff);
return [lead, trail];
}
const str = "𠮷";
console.log(utf16ToUnicode(str.charCodeAt(0), str.charCodeAt(1))); // 134071
console.log(str.codePointAt(0)); // 134071