Юникодное значение от 0 до 1,114,111. Первые 128 значений Unicode совпадают с кодировкой ASCII.
Заметим, что charCodeAt()
всегда возвращает значение, меньшее 65536. Это - из за того, что более высокие юникод-символы представлены парой вспомогательных псевдо-символов, которые вместе составляют реальный символ.
Из-за этого, чтобы получить полный символ для символов, юникод-значение которых больше или равно 65536, необходимо получить не только charCodeAt(0)
, но и charCodeAt(1)
(как для строки из двух букв).
function fixedCharCodeAt (str, idx) {
var code = str.charCodeAt(idx);
if (0xD800 <= code && code <= 0xDBFF) {
// Верхний вспомогательный символ
var hi = code;
var low = str.charCodeAt(idx+1);
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
}
if (0xDC00 <= code && code <= 0xDFFF) {
// Нижний вспомогательный символ
var hi = str.charCodeAt(idx-1);
var low = code;
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
}
return code;
}
alert(fixedCharCodeAt ('\uD800\uDC00', 0)); // 65536
alert(fixedCharCodeAt ('\uD800\uDC00', 1)); // 65536
charCodeAt()
возвращает NaN, если указанный индекс меньше нуля или больше/равен длине строки.
Пример: Использование charCodeAt
// возвратит 65, unicode-код для А
"ABC".charCodeAt(0) // 65
Следующий пример предоставляет способ убедиться, что проход по циклу всегда дает целый символ, даже если строка содержит символы за пределами основного многоязычного набора.
var str = 'A\uD800\uDC00Z' // 2 символа
// мы могли объявить сложный символ напрямую,
// т.к наш javascript-код имеет кодировку UTF.
for (var i=0, chr; i < str.length; i++) {
if ((chr = getWholeChar(str, i)) === false) {
continue // на позиции i вспомогательный символ
}
// alert будет последовательно вызван для всех символов
alert(chr);
}
function getWholeChar (str, i) {
var code = str.charCodeAt(i);
if (0xD800 <= code && code <= 0xDBFF) {
// верхний вспомогательный
if (str.length <= (i+1)) {
throw 'High surrogate without following low surrogate';
}
var next = str.charCodeAt(i+1);
if (0xDC00 > next || next > 0xDFFF) {
throw 'High surrogate without following low surrogate';
}
return str[i]+str[i+1];
}
else if (0xDC00 <= code && code <= 0xDFFF) {
// Нижний вспомогательный
if (i === 0) {
throw 'Low surrogate without preceding high surrogate';
}
var prev = str.charCodeAt(i-1);
if (0xD800 > prev || prev > 0xDBFF) {
throw 'Low surrogate without preceding high surrogate';
}
return false;
}
return str[i] // используем обращение к строке как к массиву
}
А есль ли какая нибуть противоположность charCodeAt?
В смысле? Создание строки из кода символа? String.fromCharCode(number);
В коде ошибка со знаками больше-меньше. Суррогатные символы лежат в диапазонах 0xD800 to 0xDBFF и 0xDC00 to 0xDFFF
Очень помогла статья!