【问题标题】:Convert character to ASCII code in JavaScript在 JavaScript 中将字符转换为 ASCII 码
【发布时间】:2010-09-10 18:39:57
【问题描述】:

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

例如:

从“\n”中得到 10。

【问题讨论】:

  • 请注意,大多数答案中建议的 String.prototype.charCodeAt() 方法将返回 UTF-16 代码单元(由于历史原因,甚至不是完整的正确 UTF-16 编码) .只有前 128 个 Unicode 代码点与 ASCII 字符编码直接匹配。
  • @ÁlvaroGonzález 这是一个重要的警告。我如何获得 ASCII 码,例如128?
  • @simlev ASCII 没有任何 符号,它是在货币出现之前几十年创建的。 128 是它在 Windows-1252 中的编码。在随机编码之间进行转换本身就是一个问题。

标签: javascript


【解决方案1】:
"\n".charCodeAt(0);

【讨论】:

  • 与此相反的是String.fromCharCode(10)
  • 有趣的事实:你真的不需要0(第一个参数值)——只需"\n".charCodeAt()就行了。
  • @MathiasBynens:幸运的是,这已记录在案:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…。 "如果不是数字,则默认为0"
  • 您应该指出,与String.fromCharCode( asciiNumVal ) 不同,stringInstance.charCodeAt( index ) 不是 String 类的静态方法
  • @Mathias Bynens,它当然默认为零,但我只是出于兴趣对性能进行了测试,它的性能**与使用 0 相比相对较差。jsperf.com/default-to-0-vs-0/4** 这是一个相对差异只是,无论哪种方式,它都非常非常快。
【解决方案2】:

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": ""
}

【讨论】:

  • 更好的 ascii 参考:en.wikipedia.org/wiki/ASCII - 我很自豪我为该页面上的表格所做的着色在将近 10 年后仍然存在 :)
  • @theGrayFox C:\&gt; man asciiBad command or file name
  • 请注意,这些方法与 UTF-16 兼容,这意味着根据输入字符串,charCodeAt 可以扩展到远远超过 1 字节 ASCII 值 0-127。如果任意字符串输入被 javascript 接受和处理,不要假设它在那个范围内。
  • @e2-e4 亲爱的开发人员,您使用了错误的操作系统。 man 是一个linux命令。不确定windows等价物。在浏览器上使用搜索引擎在 Windows 上搜索“man ascii”可能更安全,一个结果 -> man7.org/linux/man-pages/man7/ascii.7.html
【解决方案3】:

如果你只有一个字符而不是字符串,你可以使用:

'\n'.charCodeAt();

省略 0...

它曾经比'n'.charCodeAt(0) 慢很多,但我现在已经对其进行了测试,我看不出有任何区别(在有和没有 0 的情况下执行了 100 亿次)。仅在 Chrome 和 Firefox 中进行性能测试。

【讨论】:

  • 这实际上需要更长的时间。只使用零会更快。 (在我的电脑上,它花费了大约两倍的时间——0.055s 与 0.126s 通过几万次迭代)
【解决方案4】:

虽然其他答案都是正确的,但我更喜欢这种方式:

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 =&gt; a.charCodeAt(0);
【解决方案5】:

对于那些想要得到一个字符串的所有 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)

【讨论】:

  • 仔细检查最后一行。
  • 优雅!作为函数: function ascii(str) { return str .split('') .map(function (char) { return char + ": " + String(char.charCodeAt(0)) + "\n"; }) .reduce(function (current, previous) { return current + previous; }); }
  • [...'Foobar'].reduce((i,s)=&gt;s.charCodeAt(0)+i,0)
【解决方案6】:

JavaScript 将字符串存储为 UTF-16(双字节),因此如果您想忽略第二个字节,只需在 0000000011111111 上使用按位 &amp; 运算符将其删除(即 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

【讨论】:

  • 为什么要忽略第二个字节?
  • 问题是关于从 UTF-16 字符串(双字节)生成 ASCII。如果你没有忽略第二个字节,迟早你会得到非 ASCII 码。
  • @Steven de Salas - 您为非 ASCII 字符获取非 ASCII 代码的“解决方案”是返回 错误 ASCII 代码??
  • @CarlSmith,没错。只是为了去掉字符的非 ascii 组件。如果您使用单字节,这很有用。不过,您的项目可能需要不同的解决方案。
【解决方案7】:

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

'\n'.codePointAt(0);

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

例如

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

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

【讨论】:

  • 将特殊字符转换为十六进制表示法也可能很有用,因为某些文本编辑器可能无法正常工作,不得不直接处理这些字符。 EG: alert(str.hexEncode().hexDecode());
【解决方案8】:

将字符串转换为累计数:

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

用例:

假设您想根据用户名生成不同的背景颜色:

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;
}

【讨论】:

  • 为什么是数字“65”?那代表什么?
  • -65 是完全可选的。由于 ASCII “A”字符数字 = 65。 - 65 是可选的,用于获取第一个(“A”)字符作为 int 0
【解决方案9】:

将字符串转换为 UTF-8 的数组(流):

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

注意:ASCII是UTF-8的一个子集,所以这是一个通用的解决方案

【讨论】:

    【解决方案10】:

    为了支持 ES6 中的所有 UTF-16(也包括 non-BMP/supplementary characters),可以使用 string.codePointAt() 方法;

    此方法是 charCodeAt 的改进版本,仅支持 16 - 单个 16 位)。

    【讨论】:

    【解决方案11】:

    您可以输入一个字符并使用此代码获取 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>

    【讨论】:

      【解决方案12】:
      str.charCodeAt(index)
      

      使用charCodeAt() 以下示例返回 65,即 A 的 Unicode 值。

      'ABC'.charCodeAt(0) // 返回 65

      【讨论】:

        【解决方案13】:

        如果您仅使用 128 个原始 ASCII 字符(代码 0 到 127),则 Álvaro González 和其他人在 cmets 上扩展 charCodeAtcodePointAt 非常好。在此范围之外,代码取决于字符集,如果您希望结果有意义,则需要在计算之前进行字符集转换。

        我们以欧元符号为例:'€'.codePointAt(0) 返回 8364,它远远超出 0-127 范围,并且与 UTF-16(或 UTF-8)字符集相关。

        我正在移植一个 Visual Basic 程序,并注意到它使用Asc 函数来获取字符代码。显然,从它的角度来看,它将返回Windows-1252 字符集中的字符代码。为了确保得到相同的数字,我需要转换字符串charset,然后计算代码。

        非常简单,例如在 Python 中:ord('€'.encode('Windows-1252')).
        然而,为了在 Javascript 中实现同样的效果,我不得不求助于缓冲区和 conversion library:

        iconv = require('iconv-lite');
        buf = iconv.encode("€", 'win1252');
        buf.forEach(console.log);
        

        【讨论】:

          【解决方案14】:

          charCodeAt(0);

          以上代码在大多数情况下都有效,但是在使用单词以根据以上代码查找排名时存在一个问题。例如,aa 的排名为 97+97 = 194(实际为 1+1 = 2),而 w 的排名为 119(实际为 23),这使得 aa > w。 为了解决这个从上面的结果中减去 96,从 1 开始定位。

          charCodeAt(0) - 96;

          【讨论】:

          • alphabetically firstlater 怎么样?我建议不要使用字符代码的总和进行排名,而是直接比较每个字符。
          【解决方案15】:

          对于那些想要获得平均值字符串的所有 ASCII 码总和的人:

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

          【讨论】:

            猜你喜欢
            • 2011-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-16
            • 1970-01-01
            • 1970-01-01
            • 2011-10-03
            相关资源
            最近更新 更多