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".

levik
fuente
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);
Jim
fuente
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": ""
}
Mohsen
fuente
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.

Marco Altieri
fuente
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);
Francisco Presencia
fuente
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)
Filip Dupanović
fuente
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
Steven de Salas
fuente
¿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);  // '�'
Ibrahim Lawal
fuente
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>

Keshav Gera
fuente