aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/string/charcodeat/index.html
blob: 31899f436d4892bac414a9842413bd6ca050e746 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
---
title: String.prototype.charCodeAt()
slug: Web/JavaScript/Reference/Global_Objects/String/charCodeAt
tags:
  - JavaScript
  - Method
  - Reference
  - String
  - Unicode
translation_of: Web/JavaScript/Reference/Global_Objects/String/charCodeAt
---
<div>{{JSRef("Global_Objects", "String")}}</div>

<h2 id="Summary">Сводка</h2>

<p>Метод <strong><code>charCodeAt()</code></strong> возвращает числовое значение Юникода для символа по указанному индексу (за исключением кодовых точек Юникода, больших 0x10000).</p>

<h2 id="Syntax">Синтаксис</h2>

<pre class="syntaxbox"><code><var>str</var>.charCodeAt(<var>index</var>)</code></pre>

<h3 id="Parameters">Параметры</h3>

<dl>
 <dt><code>index</code></dt>
 <dd>Целое число больше, либо равное 0 и меньше длины строки; если параметр не является числом, он устанавливается в 0.</dd>
</dl>

<h2 id="Description">Описание</h2>

<p>Кодовые точки Юникода простираются в диапазоне от 0 до 1114111 (0x10FFFF). Первые 128 кодовых точек Юникода напрямую отображаются в кодировку ASCII. Информацию по Юникоду смотрите в <a href="/ru/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Unicode">Руководстве по JavaScript</a>.</p>

<p>Обратите внимание, что метод <code>charCodeAt()</code> всегда возвращает значение, меньшее 65536. Так происходит потому, что большие кодовые точки представляются парой (меньших значений) «суррогатных» псевдо-символов, которые используются для составления настоящего символа. Поэтому для того, чтобы получить полный символ для значений символов от 65536 и выше, необходимо получить не только значение <code>charCodeAt(i)</code>, но также значение <code>charCodeAt(i + 1)</code> (как если бы строка состояла из двух букв). Смотрите второй и третий примеры ниже.</p>

<p>Метод <code>charCodeAt()</code> возвращает {{jsxref("Global_Objects/NaN", "NaN")}}, если указанный индекс меньше нуля или больше длины строки.</p>

<p>Обратная совместимость: в более старых версиях (например, в JavaScript 1.2) метод <code>charCodeAt()</code> возвращал число из кодировки ISO-Latin-1 по указанному индексу. Диапазон символов в кодировке ISO-Latin-1 простирается от 0 до 255. Первые 127 чисел напрямую отображаются в кодировку ASCII.</p>

<h2 id="Examples">Примеры</h2>

<h3 id="Example:_Using_charCodeAt">Пример: использование метода <code>charCodeAt()</code></h3>

<p>В следующем примере возвращается число 65, значение Unicode для латинского символа «A».</p>

<pre class="brush: js">'ABC'.charCodeAt(0); // вернёт 65
</pre>

<h3 id="Example:_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown">Пример: исправление метода <code>charCodeAt()</code> для обработки символов не в Базовой многоязыковой плоскости, если их предыдущее присутствие в строке неизвестно</h3>

<p>Эта версия может использоваться в циклах for, даже когда неизвестно, были ли до указанной позиции символы из не-БМП.</p>

<pre class="brush: js">function fixedCharCodeAt(str, idx) {
  // например, fixedCharCodeAt('\uD800\uDC00', 0); // 65536
  // например, fixedCharCodeAt('\uD800\uDC00', 1); // false
  idx = idx || 0;
  var code = str.charCodeAt(idx);
  var hi, low;

  // Старшая часть суррогатной пары (последнее число можно изменить на 0xDB7F,
  // чтобы трактовать старшую часть суррогатной пары в частной плоскости как
  // одиночный символ)
  if (0xD800 &lt;= code &amp;&amp; code &lt;= 0xDBFF) {
    hi = code;
    low = str.charCodeAt(idx + 1);
    if (isNaN(low)) {
      throw 'Старшая часть суррогатной пары без следующей младшей в fixedCharCodeAt()';
    }
    return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
  }
  if (0xDC00 &lt;= code &amp;&amp; code &lt;= 0xDFFF) { // Младшая часть суррогатной пары
    // Мы возвращаем false, чтобы цикл пропустил эту итерацию,
    // поскольку суррогатная пара
    // уже обработана в предыдущей итерации
    return false;
    // hi = str.charCodeAt(idx - 1);
    // low = code;
    // return ((hi - 0xD800) * 0x400) +
    //   (low - 0xDC00) + 0x10000;
  }
  return code;
}
</pre>

<h3 id="Example:_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_known">Пример: исправление метода <code>charCodeAt()</code> для обработки символов не в Базовой многоязыковой плоскости, если их предыдущее присутствие в строке известно</h3>

<pre class="brush: js">function knownCharCodeAt(str, idx) {
  str += '';
  var code,
      end = str.length;

  var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
  while ((surrogatePairs.exec(str)) != null) {
    var li = surrogatePairs.lastIndex;
    if (li - 2 &lt; idx) {
      idx++;
    }
    else {
      break;
    }
  }

  if (idx &gt;= end || idx &lt; 0) {
    return NaN;
  }

  code = str.charCodeAt(idx);

  var hi, low;
  if (0xD800 &lt;= code &amp;&amp; code &lt;= 0xDBFF) {
    hi = code;
    low = str.charCodeAt(idx + 1);
    // Перешагиваем через один, поскольку один «символ» является частью суррогатной пары
    return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
  }
  return code;
}
</pre>

<h2 id="Specifications">Спецификации</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Спецификация</th>
   <th scope="col">Статус</th>
   <th scope="col">Комментарии</th>
  </tr>
  <tr>
   <td>ECMAScript 1-е издание.</td>
   <td>Стандарт</td>
   <td>Изначальное определение. Реализована в JavaScript 1.2.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-15.5.4.5', 'String.prototype.charCodeAt')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td> </td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-string.prototype.charcodeat', 'String.prototype.charCodeAt')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td> </td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility">Совместимость с браузерами</h2>

<p>{{Compat}}</p>

<h2 id="See_also">Смотрите также</h2>

<ul>
 <li>{{jsxref("String.fromCharCode()")}}</li>
 <li>{{jsxref("String.prototype.charAt()")}}</li>
 <li>{{jsxref("String.fromCodePoint()")}}</li>
 <li>{{jsxref("String.prototype.codePointAt()")}}</li>
</ul>