1216

How can I convert a character to its ASCII code using JavaScript?

For example:

get 10 from "\n".

GirkovArpa
  • 4,427
  • 4
  • 14
  • 43
levik
  • 114,835
  • 27
  • 73
  • 90
  • 24
    Please note that the [String.prototype.charCodeAt()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt) method suggested in most answers will return the **UTF-16 code unit** (not even the full proper UTF-16 encoding due to historical reasons). Only the first 128 Unicode code points are a direct match of the ASCII character encoding. – Álvaro González Jan 16 '18 at 13:15
  • @ÁlvaroGonzález This is an importan caveat. How do I get the ASCII code instead, e.g. `128` for `€`? – simlev Oct 15 '21 at 08:17
  • 5
    @simlev ASCII does not have any `€` symbol, it was created decades before the currency. `128` is its encoding in Windows-1252. Converting between random encodings is a problem of its own. – Álvaro González Oct 15 '21 at 08:31

18 Answers18

1785
"\n".charCodeAt(0);

Here is the documentation for charCodeAt:

The charCodeAt() method returns an integer between 0 and 65535 representing the UTF-16 code unit at the given index.

The UTF-16 code unit matches the Unicode code point for code points which can be represented in a single UTF-16 code unit. If the Unicode code point cannot be represented in a single UTF-16 code unit (because its value is greater than 0xFFFF) then the code unit returned will be the first part of a surrogate pair for the code point. If you want the entire code point value, use codePointAt().

If you need to support non-BMP Unicode characters like U+1F602 , then don't use charCodeAt, as it will not return 128514 (or 0x1f602 in hexadecimal), it will give a result you don't expect:

console.log("\u{1f602}".charCodeAt(0));
// prints 55357 , which is 0xd83d in hexadecimal
Flimm
  • 136,138
  • 45
  • 251
  • 267
Jim
  • 72,985
  • 14
  • 101
  • 108
  • 802
    The opposite of this is `String.fromCharCode(10)`. – viam0Zah May 01 '11 at 09:38
  • 226
    Fun fact: you don’t really need the `0` (first argument value) — just `"\n".charCodeAt()` will do. – Mathias Bynens Oct 17 '11 at 09:40
  • 53
    @MathiasBynens: and fortunately this is documented: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/charCodeAt. "if it is not a number, it defaults to 0" – tokland Nov 15 '11 at 19:46
  • 14
    You should point out that unlike `String.fromCharCode( asciiNumVal )`, `stringInstance.charCodeAt( index )` is __not__ a static method of class String – bobobobo Sep 12 '12 at 19:09
  • 29
    @Mathias Bynens, It certainly does default to zero but I just ran a just out of interest test on performance and it performs **relatively badly compared using 0. http://jsperf.com/default-to-0-vs-0/4 ** Its a relative difference only, either way its very very quick. – wade montague May 09 '13 at 12:35
  • 2
    @wademontague I would have never thought to perf-test that. That's so ridiculous! Thanks for the results. – Qix - MONICA WAS MISTREATED May 09 '14 at 20:55
  • 5
    I think it's a bit clearer (readability wise) to specify the index instead of leaving it to defaults...but it's minor anyway – Lior Jun 18 '14 at 12:05
  • 3
    @MathiasBynens `charCodeAt()` with no arguments makes little sense – brettwhiteman May 28 '15 at 21:40
  • 1
    @developerbmw Try `"ABC".charCodeAt(0) // return 65` is just A ... position array, other position B is `"ABC".charCodeAt(1) // return 66`, i agre @Mathias is correct. – KingRider Apr 01 '16 at 13:56
  • Apparently omitting the 0 is slower, if anyone cares. See royhowie's comment on Marco Altieri's answer below. – Andrew Mar 08 '17 at 15:18
  • please don't just give the solution explain why it would work with a supportive answer – Mahesh Jamdade Feb 04 '19 at 06:58
  • 1
    including 0 is now slower on Chrome 75 by 2% for anyone interested... interestingly, the .charCodeAt(1) was the most performant (.03% faster than no args) – Taugenichts Jun 27 '19 at 20:54
  • 1
    `charCodeAt()` without argument gives an error in TypeScript. – Laurent Payot Dec 15 '20 at 11:25
489

String.prototype.charCodeAt() can convert string characters to ASCII numbers. For example:

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

For opposite use String.fromCharCode(10) that convert numbers to equal ASCII character. This function can accept multiple numbers and join all the characters then return the string. Example:

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

Here is a quick ASCII characters reference:

{
"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": ""
}
schu34
  • 965
  • 7
  • 25
Mohsen
  • 64,437
  • 34
  • 159
  • 186
  • 46
    Better ascii reference: http://en.wikipedia.org/wiki/ASCII - I'm pretty proud the coloring I did for the tables on that page remains there after almost 10 years : ) – B T Apr 25 '14 at 19:00
  • 9
    @theGrayFox `C:\> man ascii` gives `Bad command or file name` – Déjà vu Jun 12 '15 at 06:53
  • 3
    Note that these methods are UTF-16 compatible, meaning depending on the input string, charCodeAt can extend far past 1 byte ASCII values 0-127. Don't assume it is in that range if arbitrary string input is being accepted and handled by javascript. – theferrit32 Aug 20 '19 at 21:11
  • @e2-e4 dear Developer your on the wrong OS. man is a linux command. Not sure of the windows equivalent. Probably safer using a search engine on a browser to search for 'man ascii' on windows, one result -> https://man7.org/linux/man-pages/man7/ascii.7.html – tgkprog Mar 24 '21 at 15:46
64

If you have only one char and not a string, you can use:

'\n'.charCodeAt();
'\n'.codePointAt();

omitting the 0...

It used to be significantly slower than 'n'.charCodeAt(0), but I've tested it now and I do not see any difference anymore (executed 10 billions times with and without the 0). Tested for performance only in Chrome and Firefox.

Marco Altieri
  • 3,726
  • 2
  • 33
  • 47
  • 13
    This actually takes longer. It's faster to just use the zero. (On my computer, it took ~twice as long—0.055s vs. 0.126s through a few ten thousand iterations) – royhowie Nov 27 '14 at 00:09
33

While the other answers are right, I prefer this way:

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

Then, to use it, simply:

var lineBreak = ascii("\n");

I am using this for a small shortcut system:

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

And you can even use it inside map() or other methods:

var ints = 'ergtrer'.split('').map(ascii);
Francisco Presencia
  • 8,732
  • 6
  • 46
  • 90
29

For those that want to get a sum of all the ASCII codes for a string:

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

Or, ES6:

[...'Foobar']
  .map(char => char.charCodeAt(0))
  .reduce((current, previous) => previous + current)
Manohar Reddy Poreddy
  • 25,399
  • 9
  • 157
  • 140
Filip Dupanović
  • 32,650
  • 13
  • 84
  • 114
13

To ensure full Unicode support and reversibility, consider using:

'\n'.codePointAt(0);

This will ensure that when testing characters over the UTF-16 limit, you will get their true code point value.

e.g.

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

''.charCodeAt(0);  // 55298
String.fromCharCode(55298);  // '�'
Ibrahim Lawal
  • 1,168
  • 16
  • 31
  • It might also be useful to convert the special character to hex notation, since some text editors might not work properly having to deal directly with such characters. EG: alert(str.hexEncode().hexDecode()); – Jose Tepedino Nov 11 '19 at 02:55
11

Converting string into array(stream) of UTF-8:

const str_to_arr_of_UTF8 = new TextEncoder().encode("Adfgdfs");
// [65, 100, 102, 103, 100, 102, 115]

Note: ASCII is a subset of UTF-8, so this is a universal solution

KyleMit
  • 30,350
  • 66
  • 462
  • 664
Vladimir Bushma
  • 139
  • 1
  • 5
10

JavaScript stores strings as UTF-16 (double byte) so if you want to ignore the second byte just strip it out with a bitwise & operator on 0000000011111111 (ie 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
Daniel
  • 3,541
  • 3
  • 33
  • 46
Steven de Salas
  • 20,944
  • 9
  • 74
  • 82
  • why would you want to ignore the second byte? – Roberg Mar 13 '17 at 10:19
  • 3
    Question is asking about producing ASCII from a UTF-16 string (double byte). Sooner or later you will get non-ascii codes if you fail to ignore the second byte. – Steven de Salas Mar 13 '17 at 11:24
  • 2
    @Steven de Salas - Your 'solution' to getting non-ASCII codes for non-ASCII characters is to return the **wrong** ASCII code?? – Carl Smith Sep 12 '19 at 09:21
  • @CarlSmith, not the wrong one. Just to strip out the non-ascii component of the character. If you are working with single bytes this is useful. Your project might need a different solution though. – Steven de Salas Sep 14 '19 at 06:22
4

To convert a String to a cumulative number:

const stringToSum = str => [...str||"A"].reduce((a, x) => a += x.codePointAt(0), 0);

console.log(stringToSum("A"));              // 65
console.log(stringToSum("Roko"));           // 411
console.log(stringToSum("Stack Overflow")); // 1386

Use case:

Say you want to generate different background colors depending on a username:

const stringToSum = str => [...str||"A"].reduce((a, x) => a += x.codePointAt(0), 0);

const UI_userIcon = user => {
  const hue = (stringToSum(user.name) - 65) % 360; // "A" = hue: 0
  console.log(`Hue: ${hue}`);
  return `<div class="UserIcon" style="background:hsl(${hue}, 80%, 60%)" title="${user.name}">
    <span class="UserIcon-letter">${user.name[0].toUpperCase()}</span>
  </div>`;
};

[
  {name:"A"},
  {name:"Amanda"},
  {name:"amanda"},
  {name:"Anna"},
].forEach(user => {
  document.body.insertAdjacentHTML("beforeend", UI_userIcon(user));
});
.UserIcon {
  width: 4em;
  height: 4em;
  border-radius: 4em;
  display: inline-flex;
  justify-content: center;
  align-items: center;
}

.UserIcon-letter {
  font: 700 2em/0 sans-serif;
  color: #fff;
}
Roko C. Buljan
  • 196,159
  • 39
  • 305
  • 313
4

As of 2023

From character to ASCII code

Use the method charCodeAt

console.log("\n".charCodeAt())

From ASCII code to character

Use the method fromCharCode

console.log(String.fromCharCode(10))
Bruno Peres
  • 2,980
  • 1
  • 21
  • 19
underflow
  • 1,545
  • 1
  • 5
  • 19
3

You can enter a character and get Ascii Code Using this Code

For Example Enter a Character Like A You Get Ascii Code 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.21 gigawatts
  • 16,517
  • 32
  • 123
  • 231
Keshav Gera
  • 10,807
  • 1
  • 75
  • 53
2

For supporting all UTF-16 (also non-BMP/supplementary characters) from ES6 the string.codePointAt() method is available;

This method is an improved version of charCodeAt which could support only unicode codepoints < 65536 ( 216 - a single 16bit ) .

maioman
  • 18,154
  • 4
  • 36
  • 42
  • 5
    It is worth mentioning that `String.prototype.codePointAt()` is [not supported by _any_ versions of Internet Explorer](https://learn.microsoft.com/en-us/scripting/javascript/reference/codepointat-method-string-javascript). (However it is supported on Edge.) You can get a polyfill [here](https://github.com/mathiasbynens/String.prototype.codePointAt). – mgthomas99 Aug 29 '17 at 13:36
2
str.charCodeAt(index)

Using charCodeAt() The following example returns 65, the Unicode value for A.

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

ata
  • 3,398
  • 5
  • 20
  • 31
1

Expanding on the comments by Álvaro González and others, charCodeAt or codePointAt are mighty fine if you are working with the 128 original ASCII characters only (codes 0 to 127). Outside of this range, the code is dependent on the character set, and you need a charset conversion before calculating it if you want the result to make sense.

Let's take the Euro sign as an example: '€'.codePointAt(0) returns 8364, which is well outside the 0-127 range and is relative to the UTF-16 (or UTF-8) charset.

I was porting a Visual Basic program, and noticed that it made use of the Asc function to get the character code. Obviously from its point of view, it would return the character code in the Windows-1252 character set. To be sure to obtain the same number, I need to convert the string charset and then calculate the code.

Pretty straightforward e.g. in Python: ord('€'.encode('Windows-1252')).
To achieve the same in Javascript, however, I had to resort to buffers and a conversion library:

iconv = require('iconv-lite');
buf = iconv.encode("€", 'win1252');
buf.forEach(console.log);
simlev
  • 919
  • 2
  • 12
  • 26
0

For those who want to get a sum of all the ASCII codes for a string with average value:

const ASCIIAverage = (str) =>Math.floor(str.split('').map(item => item.charCodeAt(0)).reduce((prev,next) => prev+next)/str.length)

console.log(ASCIIAverage('Hello World!'))
menomanabdulla
  • 175
  • 1
  • 5
0

charCodeAt(0);

Above code works in most cases, however there is a catch when working with words to find a ranking based on above code. For example, aa would give a ranking of 97+97 = 194 (actual would be 1+1 = 2) whereas w would give 119 (actual would be 23) which makes aa > w. To fix this subtract 96 from above result, to start he positioning from 1.

charCodeAt(0) - 96;
tejas_spy007
  • 428
  • 3
  • 14
  • What about `alphabetically first` and `later`? I would recommend against using the sum of character codes for ranking and instead compare each character directly. – anderium Dec 30 '21 at 14:58
0

As others have pointed out, ASCII only covers 128 characters (including non-printing characters). Unicode includes ASCII as its first 128 characters for the purpose of backwards compatibility, but it also includes far more characters.

To get only ASCII character codes as integers, you can do the following:

function ascii_code (character) {
  
  // Get the decimal code
  let code = character.charCodeAt(0);

  // If the code is 0-127 (which are the ASCII codes,
  if (code < 128) {
    
    // Return the code obtained.
    return code;

  // If the code is 128 or greater (which are expanded Unicode characters),
  }else{

    // Return -1 so the user knows this isn't an ASCII character.
    return -1;
  };
};

If you're looking for only the ASCII characters in a string (for say, slugifying a string), you could do something like this:

function ascii_out (str) {
  // Takes a string and removes non-ASCII characters.

  // For each character in the string,
  for (let i=0; i < str.length; i++) {

    // If the character is outside the first 128 characters (which are the ASCII
    // characters),
    if (str.charCodeAt(i) > 127) {

      // Remove this character and all others like it.
      str = str.replace(new RegExp(str[i],"g"),'');

      // Decrement the index, since you just removed the character you were on.
      i--;
    };
  };
  return str
};

Sources

claypooj
  • 333
  • 2
  • 6
0

Maybe this can be also useful (ascii characters in the order like in the ascii table):

let ascii_chars = "";
for (let i = 32; i <= 126; ++i) {
    ascii_chars += String.fromCharCode(i);
}
document.write(ascii_chars);
christo
  • 19
  • 2