Перетворення символу в ASCII-код в JavaScript


952

Як я можу перетворити символ у його ASCII код за допомогою JavaScript?

Наприклад:

отримати 10 від "\ n".


10
Зауважте, що метод String.prototype.charCodeAt (), запропонований у більшості відповідей, повертає блок коду UTF-16 (навіть не повне правильне кодування UTF-16 через історичні причини). Лише перші 128 кодів коду Unicode є прямим збігом кодування символів ASCII.
Альваро Гонсалес

Відповіді:


1448
"\n".charCodeAt(0);

658
Протилежне цьому String.fromCharCode(10).
viam0Zah

184
Веселий факт: вам не дуже потрібне 0(перше значення аргументу) - просто "\n".charCodeAt()вийде.
Матіас Байненс

47
@MathiasBynens: і на щастя це документально підтверджено: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . "якщо це не число, воно за замовчуванням до 0"
tokland

12
Слід зазначити, що на відміну від цього String.fromCharCode( asciiNumVal ), stringInstance.charCodeAt( index )це не статичний метод класу String
bobobobo

26
@Mathias Bynens. Звичайно, це за замовчуванням до нуля, але я просто запустив тест на інтерес щодо продуктивності, і він працює ** порівняно погано порівняно з використанням 0. jsperf.com/default-to-0-vs-0/4 ** Його відносна різниця лише в будь-якому випадку дуже швидко.
Wade montague

385

String.prototype.charCodeAt()може конвертувати рядкові символи в ASCII числа. Наприклад:

"ABC".charCodeAt(0) // returns 65

Для зворотного використання, String.fromCharCode(10)які перетворюють числа в рівні ASCII символів. Ця функція може приймати кілька чисел і приєднуватись до всіх символів, а потім повертати рядок. Приклад:

String.fromCharCode(65,66,67); // returns 'ABC'

Ось коротка посилання символів ASCII:

{
"31": "",      "32": " ",     "33": "!",     "34": "\"",    "35": "#",    
"36": "$",     "37": "%",     "38": "&",     "39": "'",     "40": "(",    
"41": ")",     "42": "*",     "43": "+",     "44": ",",     "45": "-",    
"46": ".",     "47": "/",     "48": "0",     "49": "1",     "50": "2",    
"51": "3",     "52": "4",     "53": "5",     "54": "6",     "55": "7",    
"56": "8",     "57": "9",     "58": ":",     "59": ";",     "60": "<",    
"61": "=",     "62": ">",     "63": "?",     "64": "@",     "65": "A",    
"66": "B",     "67": "C",     "68": "D",     "69": "E",     "70": "F",    
"71": "G",     "72": "H",     "73": "I",     "74": "J",     "75": "K",    
"76": "L",     "77": "M",     "78": "N",     "79": "O",     "80": "P",    
"81": "Q",     "82": "R",     "83": "S",     "84": "T",     "85": "U",    
"86": "V",     "87": "W",     "88": "X",     "89": "Y",     "90": "Z",    
"91": "[",     "92": "\\",    "93": "]",     "94": "^",     "95": "_",    
"96": "`",     "97": "a",     "98": "b",     "99": "c",     "100": "d",    
"101": "e",    "102": "f",    "103": "g",    "104": "h",    "105": "i",    
"106": "j",    "107": "k",    "108": "l",    "109": "m",    "110": "n",    
"111": "o",    "112": "p",    "113": "q",    "114": "r",    "115": "s",    
"116": "t",    "117": "u",    "118": "v",    "119": "w",    "120": "x",    
"121": "y",    "122": "z",    "123": "{",    "124": "|",    "125": "}",    
"126": "~",    "127": ""
}

30
Краще посилання на ascii: en.wikipedia.org/wiki/ASCII - Я дуже пишаюся тим, що забарвлення, яку я зробив для таблиць на цій сторінці, залишається там майже через 10 років
BT

9
@theGrayFox C:\> man asciiдаєBad command or file name
e2-e4

Зауважте, що ці методи сумісні з UTF-16, тобто залежно від рядка введення, charCodeAt може поширюватись далеко на 1 байт значення ASCII 0-127. Не припускайте, що він знаходиться в такому діапазоні, якщо довільний рядок вводиться і приймається JavaScript.
theferrit32

31

Якщо у вас є лише одна табличка, а не рядок, ви можете використовувати:

'\n'.charCodeAt();

опускаючи 0 ...

Хоча це повільніше. З поточною версією хрому він у 5 разів повільніше.


10
Це фактично займає більше часу. Швидше просто використовувати нуль. (На моєму комп’ютері це зайняло ~ вдвічі - 0,05s проти 0,156 через кілька десяти тисяч ітерацій)
royhowie

23

Хоча інші відповіді правильні, я віддаю перевагу наступному:

function ascii (a) { return a.charCodeAt(0); }

Потім, щоб використовувати його, просто:

var lineBreak = ascii("\n");

Я використовую це для невеликої ярликової системи:

$(window).keypress(function(event) {
  if (event.ctrlKey && event.which == ascii("s")) {
    savecontent();
    }
  // ...
  });

І ви навіть можете використовувати його всередині map () або інших методів:

var ints = 'ergtrer'.split('').map(ascii);

Просто для красуні новий спосіб ES6 написати це: const ascii = a => a.charCodeAt(0);
axkibe

20

Для тих, хто хоче отримати суму всіх кодів ASCII для рядка:

'Foobar'
  .split('')
  .map(x=>x.charCodeAt(0))
  .reduce((a,b)=>a+b);

Або ES6:

[...'Foobar']
  .map(char => char.charCodeAt(0))
  .reduce((current, previous) => previous + current)

1
Двічі перевірте останній рядок.
Ypnypn

Елегантний! як функція: function ascii (str) {return str .split ('') .map (function (char) {return char + ":" + String (char.charCodeAt (0)) + "\ n";}) .reduce (функція (поточна, попередня) {повернутий струм + попередній;}); }
Даррен Гріффіт

1
[...'Foobar'].reduce((i,s)=>s.charCodeAt(0)+i,0)
Нік

1
Ніхто не запитував суму всіх ASCII-кодів у рядку, і навряд чи це колись зробить.
Карл Сміт

8

JavaScript зберігає рядки як UTF-16(подвійний байт), тому якщо ви хочете ігнорувати другий байт, просто зніміть його за допомогою побітового &оператора на 0000000011111111(тобто 255):

'a'.charCodeAt(0) & 255 === 97; // because 'a' = 97 0 
'b'.charCodeAt(0) & 255 === 98; // because 'b' = 98 0 
'✓'.charCodeAt(0) & 255 === 19; // because '✓' = 19 39

чому ви хочете ігнорувати другий байт?
Роберг

3
Питання задається питанням створення ASCII з рядка UTF-16 (подвійний байт). Рано чи пізно ви отримаєте коди, що не мають ascii, якщо ви не будете ігнорувати другий байт.
Стівен де Салас

1
@Steven de Salas - Ваше "рішення" отримати не ASCII коди для символів, що не належать до ASCII, - це повернути неправильний код ASCII ??
Карл Сміт

@CarlSmith, не той. Просто, щоб викреслити не-ассійський компонент персонажа. Якщо ви працюєте з одним байтом, це корисно. Ваш проект може потребувати іншого рішення.
Стівен де Салас

4

Щоб забезпечити повну підтримку та реверсивність Unicode, подумайте про використання:

'\n'.codePointAt(0);

Це забезпечить тестування символів, що перевищують ліміт UTF-16, ви отримаєте їх справжнє значення кодової точки.

напр

'𐩕'.codePointAt(0); // 68181
String.fromCodePoint(68181); // '𐩕'

'𐩕'.charCodeAt(0);  // 55298
String.fromCharCode(55298);  // '�'

Також може бути корисно перетворити спеціальний символ у шістнадцяткові позначення, оскільки деякі текстові редактори можуть не працювати належним чином, маючи справу з такими символами безпосередньо. EG: сигнал (str.hexEncode (). HexDecode ());
Хосе Тепедіно

2

Ви можете ввести символ і отримати Код Ассіі, використовуючи цей Код

Наприклад, введіть такий символ, як Ви отримуєте код 65 Ассі

function myFunction(){
    var str=document.getElementById("id1");
    if (str.value=="") {
       str.focus();
       return;
    }
    var a="ASCII Code is == >  ";
document.getElementById("demo").innerHTML =a+str.value.charCodeAt(0);
}
<p>Check ASCII code</p>

<p>
  Enter any character:  
  <input type="text" id="id1" name="text1" maxLength="1">	</br>
</p>

<button onclick="myFunction()">Get ASCII code</button>

<p id="demo" style="color:red;"></p>


1

Для підтримки всіх UTF-16 (також не BMP / додаткових символів ) з ES6 доступний метод string.codePointAt () ;

Цей метод є вдосконаленою версією charCodeAt, яка могла б підтримувати лише кодові точки unicode <65536 (2 16 - один 16 біт).


4
Варто відзначити , що String.prototype.codePointAt()це не підтримуються ні в версіях Internet Explorer . (Тим НЕ менше він підтримується на Edge.) Ви можете отримати polyfill тут .
mgthomas99
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.