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

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


Автор: Гость (не зарегистрирован), дата: 7 ноября, 2016 - 03:45
#permalink

var ch = "a"; String.fromCharCode(ch.charCodeAt(0) + 1);
"b"


Автор: Гость (не зарегистрирован), дата: 15 апреля, 2022 - 23:32
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 00:33
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:17
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:51
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
1 + 18 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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