Convertir caracteres a código ASCII en JavaScript


952

¿Cómo puedo convertir un carácter a su código ASCII usando JavaScript?

Por ejemplo:

obtener 10 de "\ n".


10
Tenga en cuenta que el método String.prototype.charCodeAt () sugerido en la mayoría de las respuestas devolverá la unidad de código UTF-16 (ni siquiera la codificación UTF-16 completa debido a razones históricas). Solo los primeros 128 puntos de código Unicode coinciden directamente con la codificación de caracteres ASCII.
Álvaro González el

Respuestas:


1448
"\n".charCodeAt(0);

658
Lo contrario de esto es String.fromCharCode(10).
viam0Zah

184
Dato curioso: realmente no necesita el 0(primer valor de argumento), simplemente "\n".charCodeAt()lo hará.
Mathias Bynens

47
@MathiasBynens: y afortunadamente esto está documentado: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . "si no es un número, el valor predeterminado es 0"
tokland

12
Debe señalar que String.fromCharCode( asciiNumVal ), a diferencia , nostringInstance.charCodeAt( index ) es un método estático de clase String
bobobobo

26
@Mathias Bynens, Ciertamente, el valor predeterminado es cero, pero acabo de realizar una prueba de rendimiento por interés y funciona ** relativamente mal en comparación con 0. jsperf.com/default-to-0-vs-0/4 ** Es solo una diferencia relativa, de cualquier manera es muy, muy rápida.
Wade Montague

386

String.prototype.charCodeAt()puede convertir caracteres de cadena a números ASCII. Por ejemplo:

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

Para uso opuesto String.fromCharCode(10)que convierte números a caracteres ASCII iguales. Esta función puede aceptar múltiples números y unir todos los caracteres y luego devolver la cadena. Ejemplo:

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

Aquí hay una referencia rápida de caracteres 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
Mejor referencia ascii: en.wikipedia.org/wiki/ASCII - Estoy muy orgulloso de que el color que hice para las tablas de esa página permanezca allí después de casi 10 años
:)

99
@theGrayFox C:\> man asciidaBad command or file name
e2-e4

Tenga en cuenta que estos métodos son compatibles con UTF-16, lo que significa que dependiendo de la cadena de entrada, charCodeAt puede extender más allá de los valores ASCII de 1 byte 0-127. No asuma que está en ese rango si javascript acepta y maneja la entrada de cadena arbitraria.
theferrit32

31

Si solo tiene un carácter y no una cadena, puede usar:

'\n'.charCodeAt();

omitiendo el 0 ...

Sin embargo, es más lento. Con la versión actual de Chrome, es 5 veces más lenta.


10
Esto en realidad lleva más tiempo. Es más rápido usar el cero. (En mi computadora, tardó ~ el doble de tiempo: 0.055s vs. 0.126s en unas diez mil iteraciones)
royhowie

23

Si bien las otras respuestas son correctas, prefiero de esta manera:

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

Luego, para usarlo, simplemente:

var lineBreak = ascii("\n");

Estoy usando esto para un pequeño sistema de acceso directo:

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

E incluso puedes usarlo dentro de map () u otros métodos:

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

Solo por la belleza, una nueva forma de escribir ES6: const ascii = a => a.charCodeAt(0);
axkibe

20

Para aquellos que desean obtener una suma de todos los códigos ASCII para una cadena:

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

O, ES6:

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

1
Vuelva a verificar su última línea.
Ypnypn

¡Elegante! como una función: function ascii (str) {return str .split ('') .map (function (char) {return char + ":" + String (char.charCodeAt (0)) + "\ n";}) .reduce (function (current, previous) {return current + previous;}); }
Darren Griffith

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

1
Nadie solicitó la suma de todos los códigos ASCII en una cadena, y es poco probable que lo haga.
Carl Smith

8

JavaScript almacena cadenas como UTF-16(doble byte), por lo que si desea ignorar el segundo byte simplemente quítelo con un &operador bit a bit 0000000011111111(es decir, 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

¿Por qué querrías ignorar el segundo byte?
Roberg

3
La pregunta es acerca de producir ASCII a partir de una cadena UTF-16 (doble byte). Tarde o temprano obtendrá códigos que no sean ASCII si no ignora el segundo byte.
Steven de Salas

1
@Steven de Salas: ¿Su 'solución' para obtener códigos que no sean ASCII para caracteres que no sean ASCII es devolver el código ASCII incorrecto ?
Carl Smith

@CarlSmith, no el equivocado. Solo para quitar el componente no ascii del personaje. Si está trabajando con bytes individuales, esto es útil. Sin embargo, su proyecto podría necesitar una solución diferente.
Steven de Salas

4

Para garantizar la compatibilidad y reversibilidad completas de Unicode, considere usar:

'\n'.codePointAt(0);

Esto asegurará que cuando pruebe caracteres por encima del límite UTF-16, obtendrá su verdadero valor de punto de código.

p.ej

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

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

También podría ser útil convertir el carácter especial en notación hexadecimal, ya que algunos editores de texto podrían no funcionar correctamente al tener que lidiar directamente con dichos caracteres. Por ejemplo: alert (str.hexEncode (). HexDecode ());
Jose Tepedino

2

Puede ingresar un carácter y obtener el código Ascii usando este código

Por ejemplo, ingrese un carácter como A y obtenga el código 65 de Ascii

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

Para admitir todos los UTF-16 (también caracteres no BMP / suplementarios ) de ES6 , está disponible el método string.codePointAt () ;

Este método es una versión mejorada de charCodeAt que podría admitir solo puntos de código unicode <65536 (2 16 - un solo 16 bits).


44
Vale la pena mencionar que noString.prototype.codePointAt() es compatible con ninguna versión de Internet Explorer . (Sin embargo, es compatible con Edge). Puede obtener un polyfill aquí .
mgthomas99
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.