Convertir un caractère en code ASCII en JavaScript

952

Comment puis-je convertir un caractère en son code ASCII en utilisant JavaScript?

Par exemple:

obtenez 10 de "\ n".

levik
la source
10
Veuillez noter que la méthode String.prototype.charCodeAt () suggérée dans la plupart des réponses renverra l' unité de code UTF-16 (pas même le codage UTF-16 complet pour des raisons historiques). Seuls les 128 premiers points de code Unicode sont une correspondance directe du codage de caractères ASCII.
Álvaro González

Réponses:

1448
"\n".charCodeAt(0);
Jim
la source
658
Le contraire est String.fromCharCode(10).
viam0Zah
184
Fait amusant: vous n'avez pas vraiment besoin de la 0(première valeur d'argument) - "\n".charCodeAt()suffira.
Mathias Bynens
47
@MathiasBynens: et heureusement, cela est documenté: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . "si ce n'est pas un nombre, il vaut 0 par défaut"
tokland
12
Vous devez souligner que contrairement à String.fromCharCode( asciiNumVal ), ce stringInstance.charCodeAt( index )n'est pas une méthode statique de la classe String
bobobobo
26
@Mathias Bynens, il est certainement par défaut à zéro, mais je viens de lancer un test de désintérêt sur les performances et il fonctionne ** relativement mal comparé en utilisant 0. jsperf.com/default-to-0-vs-0/4 ** C'est une différence relative seulement, de toute façon, c'est très très rapide.
wade montague
386

String.prototype.charCodeAt()peut convertir des caractères de chaîne en nombres ASCII. Par exemple:

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

Pour une utilisation opposée String.fromCharCode(10), convertissez les nombres en caractères ASCII égaux. Cette fonction peut accepter plusieurs nombres et joindre tous les caractères puis renvoyer la chaîne. Exemple:

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

Voici une référence rapide des caractères 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
la source
30
Meilleure référence ascii: en.wikipedia.org/wiki/ASCII - Je suis assez fier que la coloration que j'ai faite pour les tableaux de cette page reste là après presque 10 ans
:)
9
@theGrayFox C:\> man asciidonneBad command or file name
e2-e4
Notez que ces méthodes sont compatibles UTF-16, ce qui signifie qu'en fonction de la chaîne d'entrée, charCodeAt peut s'étendre bien au-delà des valeurs ASCII de 1 octet 0-127. Ne présumez pas qu'il se trouve dans cette plage si une entrée de chaîne arbitraire est acceptée et gérée par javascript.
theferrit32
31

Si vous n'avez qu'un seul caractère et pas une chaîne, vous pouvez utiliser:

'\n'.charCodeAt();

en omettant le 0 ...

Mais c'est plus lent. Avec la version actuelle du chrome, il est 5 fois plus lent.

Marco Altieri
la source
10
Cela prend en fait plus de temps. Il est plus rapide d'utiliser simplement le zéro. (Sur mon ordinateur, cela a pris environ deux fois plus longtemps - 0,055 s contre 0,126 s sur quelques dix mille itérations)
royhowie
23

Bien que les autres réponses soient correctes, je préfère cette façon:

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

Ensuite, pour l'utiliser, simplement:

var lineBreak = ascii("\n");

J'utilise ceci pour un petit système de raccourcis:

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

Et vous pouvez même l'utiliser dans map () ou d'autres méthodes:

var ints = 'ergtrer'.split('').map(ascii);
Francisco Presencia
la source
Juste pour la beauté, une nouvelle façon ES6 de l'écrire: const ascii = a => a.charCodeAt(0);
axkibe
20

Pour ceux qui veulent obtenir une somme de tous les codes ASCII pour une chaîne:

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

Ou, ES6:

[...'Foobar']
  .map(char => char.charCodeAt(0))
  .reduce((current, previous) => previous + current)
Filip Dupanović
la source
1
Vérifiez votre dernière ligne.
Ypnypn
Élégant! en tant que fonction: fonction ascii (str) {return str .split ('') .map (function (char) {return char + ":" + String (char.charCodeAt (0)) + "\ n";}) .reduce (fonction (courant, précédent) {retour courant + précédent;}); }
Darren Griffith
1
[...'Foobar'].reduce((i,s)=>s.charCodeAt(0)+i,0)
Nick
1
Personne n'a demandé la somme de tous les codes ASCII dans une chaîne et il est peu probable qu'ils le fassent jamais.
Carl Smith
8

JavaScript stocke les chaînes sous la forme UTF-16(double octet), donc si vous voulez ignorer le deuxième octet, supprimez-le simplement avec un &opérateur au niveau du bit 0000000011111111(par exemple 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
la source
pourquoi voudriez-vous ignorer le deuxième octet?
Roberg
3
La question porte sur la production d'ASCII à partir d'une chaîne UTF-16 (double octet). Tôt ou tard, vous obtiendrez des codes non ascii si vous ne parvenez pas à ignorer le deuxième octet.
Steven de Salas
1
@Steven de Salas - Votre «solution» pour obtenir des codes non ASCII pour des caractères non ASCII est de renvoyer le mauvais code ASCII ??
Carl Smith
@CarlSmith, pas le mauvais. Juste pour retirer la composante non ascii du personnage. Si vous travaillez avec des octets uniques, cela est utile. Votre projet peut cependant avoir besoin d'une solution différente.
Steven de Salas
4

Pour garantir la prise en charge et la réversibilité complètes d'Unicode, envisagez d'utiliser:

'\n'.codePointAt(0);

Cela garantira que lorsque vous testez des caractères au-dessus de la limite UTF-16, vous obtiendrez leur véritable valeur de point de code.

par exemple

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

'𐩕'.charCodeAt(0);  // 55298
String.fromCharCode(55298);  // '�'
Ibrahim Lawal
la source
Il peut également être utile de convertir le caractère spécial en notation hexadécimale, car certains éditeurs de texte peuvent ne pas fonctionner correctement, car ils doivent traiter directement ces caractères. EG: alerte (str.hexEncode (). HexDecode ());
Jose Tepedino
2

Vous pouvez entrer un caractère et obtenir le code Ascii en utilisant ce code

Par exemple, entrez un caractère comme un code Ascii 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>

Keshav Gera
la source
1

Pour prendre en charge tous les UTF-16 (également les caractères non BMP / supplémentaires ) de ES6, la méthode string.codePointAt () est disponible;

Cette méthode est une version améliorée de charCodeAt qui ne pouvait prendre en charge que les points de code unicode <65536 (2 16 - un seul 16 bits).

maioman
la source
4
Il convient de mentionner qu'il String.prototype.codePointAt()n'est pris en charge par aucune version d'Internet Explorer . (Cependant, il est pris en charge sur Edge.) Vous pouvez obtenir un polyfill ici .
mgthomas99