Chuyển đổi ký tự thành mã ASCII trong JavaScript


952

Làm cách nào tôi có thể chuyển đổi một ký tự thành mã ASCII của nó bằng JavaScript?

Ví dụ:

nhận 10 từ "\ n".


10
Xin lưu ý rằng phương thức String.prototype.charCodeAt () được đề xuất trong hầu hết các câu trả lời sẽ trả về đơn vị mã UTF-16 (thậm chí không phải là mã hóa UTF-16 thích hợp đầy đủ vì lý do lịch sử). Chỉ 128 điểm mã Unicode đầu tiên là khớp trực tiếp với mã hóa ký tự ASCII.
Álvaro González

Câu trả lời:


1448
"\n".charCodeAt(0);

658
Đối lập với điều này là String.fromCharCode(10).
viam0Zah

184
Sự thật thú vị: bạn không thực sự cần 0(giá trị đối số đầu tiên) - chỉ cần "\n".charCodeAt()làm.
Mathias Bynens

47
@MathiasBynens: và may mắn thay, điều này được ghi lại: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/ . "nếu nó không phải là một số, nó mặc định là 0"
tokland

12
Bạn nên chỉ ra rằng không giống như String.fromCharCode( asciiNumVal ), stringInstance.charCodeAt( index )không một phương thức tĩnh của lớp String
bobobobo

26
@Mathias Bynens, Nó chắc chắn mặc định là 0 nhưng tôi chỉ chạy thử nghiệm quan tâm về hiệu suất và nó thực hiện ** tương đối tệ khi sử dụng 0. jsperf.com/default-to-0-vs-0/4 ** Đó chỉ là một sự khác biệt tương đối, dù bằng cách nào thì nó rất rất nhanh.
lội montague

385

String.prototype.charCodeAt()có thể chuyển đổi các ký tự chuỗi thành số ASCII. Ví dụ:

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

Đối với việc sử dụng ngược lại String.fromCharCode(10)mà chuyển đổi số thành ký tự ASCII bằng nhau. Hàm này có thể chấp nhận nhiều số và nối tất cả các ký tự sau đó trả về chuỗi. Thí dụ:

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

Dưới đây là tài liệu tham khảo các ký tự ASCII nhanh chóng:

{
"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
Tham khảo ascii tốt hơn: en.wikipedia.org/wiki/ASCII - Tôi khá tự hào về màu sắc tôi đã làm cho các bảng trên trang đó vẫn còn đó sau gần 10 năm :)
BT

9
@theGrayFox C:\> man asciiđưa raBad command or file name
e2-e4

Lưu ý rằng các phương thức này tương thích UTF-16, nghĩa là tùy thuộc vào chuỗi đầu vào, charCodeAt có thể kéo dài hơn 1 byte giá trị ASCII 0-127. Đừng cho rằng nó nằm trong phạm vi đó nếu đầu vào chuỗi tùy ý được chấp nhận và xử lý bởi javascript.
theferrit32

31

Nếu bạn chỉ có một char và không phải là một chuỗi, bạn có thể sử dụng:

'\n'.charCodeAt();

bỏ qua 0 ...

Nó là chậm hơn mặc dù. Với phiên bản chrome hiện tại, nó chậm hơn 5 lần.


10
Điều này thực sự mất nhiều thời gian hơn. Nó nhanh hơn khi chỉ sử dụng số không. (Trên máy tính của tôi, phải mất gấp đôi thời gian dài 0,055 giây so với 0,125 qua vài chục lần lặp lại)
royhowie

23

Trong khi các câu trả lời khác là đúng, tôi thích cách này:

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

Sau đó, để sử dụng nó, chỉ cần:

var lineBreak = ascii("\n");

Tôi đang sử dụng điều này cho một hệ thống phím tắt nhỏ:

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

Và thậm chí bạn có thể sử dụng nó bên trong map () hoặc các phương thức khác:

var ints = 'ergtrer'.split('').map(ascii);

Chỉ dành cho người đẹp một cách viết ES6 mới: const ascii = a => a.charCodeAt(0);
axkibe

20

Đối với những người muốn nhận tổng số tất cả các mã ASCII cho một chuỗi:

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

Hoặc, ES6:

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

1
Kiểm tra kỹ dòng cuối cùng của bạn.
Ypnypn

Thanh lịch! as a function: function ascii (str) {return str .split ('') .map (function (char) {return char + ":" + String (char.charCodeAt (0)) + "\ n";}) .reduce (hàm (hiện tại, trước) {return current + trước;}); }
Darren Griffith

1
[...'Foobar'].reduce((i,s)=>s.charCodeAt(0)+i,0)
Nick

1
Không ai yêu cầu tổng số tất cả các mã ASCII trong một chuỗi và dường như không bao giờ làm như vậy.
Carl Smith

8

JavaScript lưu trữ các chuỗi dưới dạng UTF-16(byte kép), vì vậy nếu bạn muốn bỏ qua byte thứ hai, chỉ cần loại bỏ nó bằng toán &tử bitwise 0000000011111111(ví dụ 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

Tại sao bạn muốn bỏ qua byte thứ hai?
Roberg

3
Câu hỏi đang hỏi về việc sản xuất ASCII từ chuỗi UTF-16 (byte kép). Sớm hay muộn bạn sẽ nhận được mã không phải mã ascii nếu bạn không bỏ qua byte thứ hai.
Steven de Salas

1
@Steven de Salas - 'Giải pháp' của bạn để nhận mã không phải ASCII cho các ký tự không phải ASCII là trả lại mã ASCII sai ??
Carl Smith

@CarlSmith, không sai. Chỉ cần loại bỏ thành phần phi ascii của nhân vật. Nếu bạn đang làm việc với các byte đơn thì điều này rất hữu ích. Dự án của bạn có thể cần một giải pháp khác mặc dù.
Steven de Salas

4

Để đảm bảo hỗ trợ và đảo ngược Unicode đầy đủ, hãy xem xét sử dụng:

'\n'.codePointAt(0);

Điều này sẽ đảm bảo rằng khi kiểm tra các ký tự vượt quá giới hạn UTF-16, bạn sẽ nhận được giá trị điểm mã thực sự của chúng.

ví dụ

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

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

Cũng có thể hữu ích khi chuyển đổi ký tự đặc biệt thành ký hiệu hex, vì một số trình soạn thảo văn bản có thể không hoạt động chính xác khi phải xử lý trực tiếp với các ký tự đó. EG: cảnh báo (str.hexEncode (). HexDecode ());
Jose Tepedino

2

Bạn có thể nhập một ký tự và nhận Mã Ascii bằng Mã này

Ví dụ: Nhập một ký tự giống như bạn Nhận mã 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>


1

Để hỗ trợ tất cả UTF-16 (cũng không phải BMP / ký tự bổ sung ) từ ES6, phương thức string.codePointAt () có sẵn;

Phương pháp này là phiên bản cải tiến của charCodeAt, chỉ có thể hỗ trợ các điểm mã unicode <65536 (2 16 - 16 bit đơn).


4
Điều đáng nói String.prototype.codePointAt()không được hỗ trợ bởi bất kỳ phiên bản nào của Internet Explorer . (Tuy nhiên, nó được hỗ trợ trên Edge.) Bạn có thể nhận được một polyfill tại đây .
mgthomas99
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.