在JavaScript中将字符转换为ASCII代码


952

如何使用JavaScript将字符转换为ASCII码?

例如:

从“ \ n”获得10。


10
请注意,大多数答案中建议的String.prototype.charCodeAt()方法将返回UTF-16代码单元(由于历史原因,甚至不完整的UTF-16编码)。仅前128个Unicode代码点与ASCII字符编码直接匹配。
阿瓦罗·冈萨雷斯

Answers:


1448
"\n".charCodeAt(0);

658
相反的是String.fromCharCode(10)
viam0Zah 2011年

184
有趣的事实:您实际上并不需要0(第一个参数值),只需"\n".charCodeAt()这样做。
Mathias Bynens 2011年

47
@MathiasBynens:幸运的是,有文档记录:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…。“如果不是数字,则默认为0”
tokland 2011年

12
您应该指出,与不是不同String.fromCharCode( asciiNumVal )stringInstance.charCodeAt( index )不是 String类的静态方法
bobobobo 2012年

26
@Mathias Bynens,它的确默认为零,但我只是对性能进行了无趣的测试,它的性能比使用0时要差很多。jsperf.com/default-to- 0- vs- 0/ 4 **它只是一个相对的差异,无论哪种方式都非常非常快。
韦德·蒙塔古

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

不过,它比较慢。使用当前版本的chrome,速度要慢5倍。


10
这实际上需要更长的时间。仅使用零更快。(在我的计算机上,经过几万次迭代,花了大约两倍的时间-0.055s vs. 0.126s)
royhowie 2014年

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(function(current,previous){return current + previous;}); }
达伦·格里菲斯

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

为什么要忽略第二个字节?
罗伯格,2017年

3
问题是关于从UTF-16字符串(双字节)生成ASCII的问题。如果您不忽略第二个字节,迟早会得到非ASCII码。
史蒂文·德·萨拉斯

1
@Steven de Salas-为非ASCII字符获取非ASCII码的“解决方案”是返回错误的 ASCII码?
卡尔·史密斯,

@CarlSmith,这不是错误的。只是去除字符的非ASCII成分。如果您使用单个字节,这将很有用。但是,您的项目可能需要其他解决方案。
史蒂文·德·萨拉斯

4

为了确保完全支持Unicode和可逆性,请考虑使用:

'\n'.codePointAt(0);

这将确保在测试超过UTF-16限制的字符时,您将获得其真实的代码点值。

例如

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

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

将特殊字符转换为十六进制也可能很有用,因为某些文本编辑器可能不得不直接处理此类字符而无法正常工作。EG:alert(str.hexEncode()。hexDecode());
Jose Tepedino

2

您可以输入一个字符并使用此代码获取Ascii代码

例如,输入一个像A的字符,您将得到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>


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.