Javascript.RU

charCodeAt

Синтаксис

var codepoint = string.charCodeAt(index)

Аргументы

index
целое число от 0 до длины строки-1

Описание, примеры

Юникодное значение от 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] // используем обращение к строке как к массиву
}

Автор: Гость (не зарегистрирован), дата: 14 июля, 2010 - 21:02
#permalink

А есль ли какая нибуть противоположность charCodeAt?


Автор: B@rmaley.e><e, дата: 15 июля, 2010 - 22:19
#permalink

В смысле? Создание строки из кода символа? String.fromCharCode(number);


Автор: yapepyaka (не зарегистрирован), дата: 27 июня, 2015 - 13:33
#permalink

В коде ошибка со знаками больше-меньше. Суррогатные символы лежат в диапазонах 0xD800 to 0xDBFF и 0xDC00 to 0xDFFF


Автор: mos-music Музыкальный магазин (не зарегистрирован), дата: 17 декабря, 2015 - 00:31
#permalink

Очень помогла статья!


 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние темы на форуме
Forum