แปลงอักขระเป็นรหัส ASCII ใน JavaScript


952

ฉันจะแปลงอักขระเป็นรหัส ASCII โดยใช้ JavaScript ได้อย่างไร

ตัวอย่างเช่น:

รับ 10 จาก "\ n"


10
โปรดทราบว่าวิธีการString.prototype.charCodeAt () ที่แนะนำในคำตอบส่วนใหญ่จะส่งคืนรหัสหน่วย UTF-16 (ไม่ใช่แม้แต่การเข้ารหัส UTF-16 ที่เหมาะสมเต็มรูปแบบเนื่องจากเหตุผลทางประวัติศาสตร์) เฉพาะจุดรหัส 128 Unicode แรกเท่านั้นที่ตรงกับการเข้ารหัสอักขระ ASCII
ÁlvaroGonzález

คำตอบ:


1448
"\n".charCodeAt(0);

658
String.fromCharCode(10)ตรงข้ามของที่นี่คือ
viam0Zah

184
สนุกจริง: คุณไม่ต้องการ0(ค่าอาร์กิวเมนต์แรก) - "\n".charCodeAt()จะทำ
Mathias Bynens

47
@MathiasBynens: และโชคดีที่นี้เป็นเอกสาร: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/... "ถ้าไม่ใช่ตัวเลขจะมีค่าเริ่มต้นเป็น 0"
tokland

12
คุณควรจะชี้ให้เห็นว่าแตกต่างString.fromCharCode( asciiNumVal ), stringInstance.charCodeAt( index )คือไม่ได้เป็นวิธีการที่คงที่ของคลาส String
bobobobo

26
@Mathias Bynens แน่นอนว่ามันเป็นค่าเริ่มต้นที่เป็นศูนย์ แต่ฉันเพิ่งทดสอบประสิทธิภาพที่น่าสนใจและมีประสิทธิภาพ ** ค่อนข้างแย่เมื่อเทียบกับการใช้ 0. jsperf.com/default-to-0-vs-0/4 ** มันเป็นความแตกต่างที่สัมพันธ์กันอย่างใดอย่างหนึ่งอย่างรวดเร็วมาก
ลุย montague

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 อย่าสันนิษฐานว่ามันอยู่ในช่วงนั้นหากมีการป้อนและจัดการสตริงโดยพลการโดยจาวาสคริปต์
theferrit32

31

หากคุณมีเพียงถ่านเดียวและไม่ใช่สตริงคุณสามารถใช้:

'\n'.charCodeAt();

ละเว้น 0 ...

มันช้ากว่าแม้ว่า ด้วย Chrome รุ่นปัจจุบันมันช้ากว่า 5 เท่า


10
สิ่งนี้ใช้เวลานานกว่าจริง มันเร็วกว่าที่จะใช้ศูนย์ (บนคอมพิวเตอร์ของฉันมันใช้เวลานานเป็นสองเท่า - 0.055 วินาทีเทียบกับ 0.126 วินาทีผ่านการทำซ้ำสองสามหมื่นครั้ง)
royhowie

23

ในขณะที่คำตอบอื่น ๆ ถูกต้องฉันชอบวิธีนี้:

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

จากนั้นเพื่อใช้งานเพียง:

var lineBreak = ascii("\n");

ฉันใช้สิ่งนี้กับระบบทางลัดขนาดเล็ก:

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

และคุณยังสามารถใช้ภายในแผนที่ () หรือวิธีอื่น ๆ :

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

สง่างาม! เป็นฟังก์ชั่น: ฟังก์ชั่น ascii (str) {return str .split ('') .map (ฟังก์ชั่น (char) {return char + ":" + สตริง (char.charCodeAt (0)) + "\ n";}) .reduce (ฟังก์ชั่น (ปัจจุบัน, ก่อนหน้า) {ส่งคืนกระแส + ก่อนหน้า;}); }
Darren Griffith

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

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

ทำไมคุณถึงไม่สนใจไบต์ที่สอง?
Roberg

3
คำถามจะถามเกี่ยวกับการผลิต ASCII จากสตริง UTF-16 (ไบต์คู่) ไม่ช้าก็เร็วคุณจะได้รับรหัส non-ascii หากคุณไม่สนใจไบต์ที่สอง
Steven de Salas

1
@Steven de Salas - 'โซลูชัน' ของคุณเพื่อรับรหัสที่ไม่ใช่ ASCII สำหรับอักขระที่ไม่ใช่ ASCII คือการส่งคืนรหัส ASCII ที่ไม่ถูกต้องหรือไม่ ?
Carl Smith

@CarlSmith ไม่ใช่คนผิด เพียงเพื่อแยกองค์ประกอบที่ไม่ใช่ ASCII ของตัวละคร หากคุณทำงานกับไบต์เดียวสิ่งนี้มีประโยชน์ โครงการของคุณอาจต้องการโซลูชันที่แตกต่าง
Steven de Salas

4

เพื่อให้การสนับสนุน Unicode เต็มรูปแบบและความสามารถในการกลับรายการได้ให้พิจารณาใช้

'\n'.codePointAt(0);

สิ่งนี้จะช่วยให้มั่นใจได้ว่าเมื่อทดสอบอักขระเกินขีด จำกัด UTF-16 คุณจะได้รับค่ารหัสจุดจริง

เช่น

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

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

นอกจากนี้ยังอาจเป็นประโยชน์ในการแปลงอักขระพิเศษให้เป็นเลขฐานสิบหกเนื่องจากตัวแก้ไขข้อความบางตัวอาจทำงานได้ไม่ถูกต้องเมื่อต้องจัดการกับอักขระดังกล่าวโดยตรง EG: การแจ้งเตือน (str.hexEncode (). hexDecode ());
Jose Tepedino

2

คุณสามารถป้อนตัวอักษรและรับรหัส Ascii โดยใช้รหัสนี้

ตัวอย่างเช่นป้อนตัวละครอย่างคุณได้รับรหัส 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

สำหรับการสนับสนุนทุก UTF-16 (ยังไม่ใช่ BMP / ตัวละครเสริม ) จาก ES6 string.codePointAt ()เป็นวิธีการที่สามารถใช้ได้;

วิธีการนี้เป็นรุ่นที่ปรับปรุงแล้วของ charCodeAt ซึ่งสามารถรองรับการเข้ารหัสรหัส unicode <65536 (2 16 - 16 บิตเดียว)


4
เป็นมูลค่าการกล่าวขวัญว่าString.prototype.codePointAt()จะไม่สนับสนุนใด ๆรุ่นของ Internet Explorer ( แต่จะได้รับการสนับสนุนบนขอบ.) คุณจะได้รับ polyfill ที่นี่
mgthomas99
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.