ชุดอักขระของ JavaScript:
โปรแกรม JavaScript เขียนขึ้นโดยใช้ชุดอักขระ Unicode Unicode เป็น superset ของ ASCII และ Latin-1 และรองรับเกือบทุกภาษาบนโลก Ecmascript3 ต้องการ JavaScript เพื่อรองรับ Unicode 2.1 และรุ่นต่อ ๆ ไปในขณะที่ ECMAScript5 ต้องการการสนับสนุน Unicode 3 และรุ่นต่อ ๆ ไป ดังนั้นเราจึงเขียนมัน
โปรแกรม JavaScript ถูกเข้ารหัสทั้งหมดโดยใช้ Unicode
UTF-8
UTF-8 (รูปแบบการแปลง Unicode UTF8-bit) คือการเข้ารหัสอักขระความยาวตัวแปรสำหรับ Unicode และยังเป็นรหัสคำนำหน้า
มันสามารถใช้เพื่อแสดงถึงอักขระใด ๆ ในมาตรฐาน Unicode และไบต์แรกในการเข้ารหัสยังคงเข้ากันได้กับ ASCII ซึ่งทำให้เป็นไปได้สำหรับซอฟต์แวร์ที่ แต่เดิมจัดการอักขระ ASCII เพื่อใช้งานต่อไปโดยไม่ต้องมีการดัดแปลงเล็กน้อย ดังนั้นจึงค่อยๆกลายเป็นการเข้ารหัสที่ต้องการในอีเมลหน้าเว็บและแอปพลิเคชันอื่น ๆ สำหรับการจัดเก็บหรือส่งข้อความ
เว็บไซต์ส่วนใหญ่ใช้การเข้ารหัส UTF-8
แปลงสตริง unicode-encoded ที่สร้างโดย JavaScript เป็น string encoded uTF-8
ดังที่ได้กล่าวไว้ในชื่อเรื่องสถานการณ์แอปพลิเคชันเป็นเรื่องธรรมดามาก ตัวอย่างเช่นเมื่อส่งไบนารีไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์กำหนดว่าการเข้ารหัสเนื้อหาไบนารีจะต้องเป็น UTF-8 ในกรณีนี้เราต้องแปลงสตริง Unicode ของ JavaScript เป็นสตริงที่เข้ารหัส UTF-8 ผ่านโปรแกรม
วิธีการแปลง
ก่อนการแปลงเราต้องเข้าใจว่าโครงสร้างการเข้ารหัสของ Unicode ได้รับการแก้ไขแล้ว
หากคุณไม่เชื่อคุณสามารถลองใช้สตริง charcodeat เพื่อดูว่า Charcode ที่ส่งคืนนั้นใช้เวลาเท่าใด
•ภาษาอังกฤษมีตัวละคร 1 ตัวและตัวละครจีนมี 2 ตัวอักษร
อย่างไรก็ตามความยาวของโครงสร้างการเข้ารหัสของ UTF-8 จะถูกกำหนดโดยขนาดของอักขระเดียว
ด้านล่างคือขนาดของอักขระตัวเดียวที่ใช้หลายไบต์ ความยาวสูงสุดหลังจากอักขระ Unicode เดียวคือ 6 ไบต์
• 1 ไบต์: รหัส Unicode คือ 0 - 127
• 2 ไบต์: รหัส Unicode คือ 128 - 2047
• 3 ไบต์: รหัส Unicode คือ 2048 - 0xffff
• 4 ไบต์: รหัส Unicode คือ 65536 - 0x1fffff
• 5 ไบต์: รหัส Unicode คือ 0x200000 - 0x3ffffff
• 6 ไบต์: รหัส Unicode คือ 0x4000000 - 0x7fffffff
สำหรับรายละเอียดโปรดดูรูปภาพ:
เนื่องจากรหัส Unicode ของอักขระภาษาอังกฤษและภาษาอังกฤษคือ 0 - 127 ความยาวและไบต์ของภาษาอังกฤษใน Unicode และ UTF -8 จึงเหมือนกันและครอบครองเพียง 1 ไบต์ นี่คือเหตุผลที่ UTF8 เป็นชุดของ Unicode!
ตอนนี้ให้พูดคุยเกี่ยวกับอักขระภาษาจีนเพราะช่วงเวลารหัส Unicode ของอักขระจีนคือ 0x2e80 - 0x9fff ดังนั้นความยาวของอักขระจีนใน UTF8 สูงถึง 3 ไบต์
ดังนั้นตัวละครจีนจะแปลงจาก 2 ไบต์ของ Unicode เป็นสามไบต์ของ UTF8 ได้อย่างไร
สมมติว่าฉันต้องแปลงอักขระภาษาจีน "中" เป็นการเข้ารหัส UTF-8
1. รับขนาดของตัวอักษรจีน
var str = 'in'; var charcode = str.charcodeat (0); console.log (charcode); // => 20013
2. การตัดสินความยาวของ UTF8 ตามขนาด
จากขั้นตอนก่อนหน้าเราได้รับ charcode ของตัวละครจีน "ใน" คือปี 20013 จากนั้นเราพบว่าปี 20013 ตั้งอยู่ในช่วงเวลา 2048 - 0xffff ดังนั้นตัวละครจีน "ใน" ควรครอบครอง 3 ไบต์ใน UTF8
3. ส่วนประกอบ
เนื่องจากเรารู้ว่าตัวละครจีน "ฉัน" จำเป็นต้องครอบครอง 3 ไบต์เราจะได้ 3 ไบต์เหล่านี้ได้อย่างไร?
สิ่งนี้ต้องมีการออกแบบรหัสส่วนประกอบ ตรรกะรหัสเสริมเฉพาะมีดังนี้:
ตกลงฉันรู้ว่าคุณไม่เข้าใจรูปนี้ดังนั้นฉันจะพูดถึงมัน!
รหัสการเติมที่เฉพาะเจาะจงมีดังนี้ "x" หมายถึงพื้นที่ว่างที่ใช้สำหรับการเติม
• 0xxxxxxx
• 110xxxxx 10xxxxxxx
• 1110xxxx 10xxxxxx 10xxxxxxx
• 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxx
• 111110xx 10xxxxxx 10xxxxxx 10xxxxxxxxxxxxxxxx 10xxxxxxx
• 1111110X 10xxxxxx 10xxxxx 10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
คำเตือน: คุณพบไหม? ไบต์แรกของรหัสการเติมระบุจำนวนไบต์ทั้งหมดรหัส UTF-8 ที่ใช้งานได้! คุณลักษณะนี้ใช้โดย UTF-8 ที่ถอดรหัสเป็น Unicode ~
มายกตัวอย่างง่ายๆก่อน แปลงตัวอักษรภาษาอังกฤษ "A" เป็นการเข้ารหัส UTF8
1. Charcode ของ "A" คือ 65
2. 65 อยู่ในช่วงเวลาระหว่าง 0-127 ดังนั้น "a" จะใช้หนึ่งไบต์
3. ส่วนประกอบของหนึ่งไบต์ใน UTF8 คือ 0xxxxxxx X หมายถึงตำแหน่งที่ว่างและใช้สำหรับส่วนประกอบ
4. แปลง 65 เป็นไบนารีเพื่อรับ 1000001
5. เพิ่ม 1000001 ไปยังตำแหน่งว่าง 1xxxxxx ตามลำดับจากด้านหน้าไปด้านหลังและรับ 01000001
6. แปลง 11000001 เป็นสตริงเพื่อรับ "A"
7. ในที่สุด "A" ถูกเข้ารหัสโดย UTF8
ด้วยตัวอย่างเล็ก ๆ นี้เราตรวจสอบอีกครั้งว่า UTF-8 เป็น superset ของ Unicode!
โอเคกลับไปที่ตัวละครจีน "กลาง" ก่อนหน้านี้เราได้รับ charcode ของ "กลาง" เป็นปี 20013 และไบนารีคือ 010011100 00101101 รายละเอียดมีดังนี้:
รหัส var = 20013; code.toString (2); // => 10011100101 เทียบเท่ากับ 01001110 00101101
จากนั้นเราทำตามวิธีการ "A" ในการเติมด้านบนเพื่อเติมในตำแหน่ง
เติมเต็ม 01001110 00101101 ตามลำดับจากด้านหน้าไปกลับไปที่ 1110xxxxx 10xxxxxxxxxxxxxxxx รับ 11100100 10111000 10101101
4. รับเนื้อหาที่เข้ารหัส UTF8
ผ่านขั้นตอนข้างต้นเราได้รับสาม UTF8 ไบต์ของ "in", 11100100 10111000 1010110101
เราแปลงแต่ละไบต์เป็น hexadecimal และรับ 0xe4 0xb8 0xad;
จากนั้น 0xe4 0xb8 0xad คือการเข้ารหัส UTF8 ที่เราได้รับในที่สุด
เราใช้บัฟเฟอร์ NodeJS เพื่อตรวจสอบว่าถูกต้องหรือไม่
var buffer = buffer ใหม่ ('in'); console.log (buffer.length); // => 3console.log (บัฟเฟอร์); // => <buffer e4 b8 ad> // ในที่สุดก็ได้รับสามไบต์ 0xe4 0xb8 0xadเนื่องจาก Hexadecimal นั้นปราศจากกรณีมันเหมือนกับที่เราคำนวณว่า 0xe4 0xb8 0xad หรือไม่?
เขียนตรรกะการเข้ารหัสด้านบนลงในฟังก์ชั่น
// จัดรูปแบบสตริงลงใน UTF8 ที่เข้ารหัส bytes var writeUtf = function (str, isgetBytes) {var back = []; var bytesize = 0; สำหรับ (var i = 0; i <str.length; i ++) {var code = str.charcodeat (i); if (0x00 <= รหัส && รหัส <= 0x7f) {bytesize += 1; back.push (รหัส); } อื่นถ้า (0x80 <= รหัส && รหัส <= 0x7ff) {bytesize += 2; back.push ((192 | (31 & (รหัส >> 6))))); back.push ((128 | (63 & รหัส)))} ถ้า ((0x800 <= รหัส && รหัส <= 0xd7ff) || (0xe000 <= รหัส && รหัส <= 0xffff)) {bytesize += 3; back.push ((224 | (15 & (รหัส >> 12)))); back.push ((128 | (63 & (รหัส >> 6)))); back.push ((128 | (63 & รหัส)))} สำหรับ (i = 0; i <back.length; i ++) {back [i] & = 0xff; } if (isgetBytes) {return} if (bytesize <= 0xff) {return [0, bytesize] .concat (back); } else {return [bytesize >> 8, bytesize & 0xff] .concat (back); }} writeUtf ('in-on'); // => [0, 3, 228, 184, 173] // สองหลักแรกแสดงถึงความยาวของไบต์ UTF8 ที่ตามมา เนื่องจากความยาวคือ 3 สองไบต์แรกคือ `0, 3` // เนื้อหาคือ` 228, 184, 173 ' // อ่านไบต์ที่เข้ารหัส UTF8 และได้รับการออกแบบมาเป็นพิเศษสำหรับสตริงของ Unicode var readUtf = function (arr) {ถ้า (typeof arr === 'สตริง') {return arr; } var utf = '', _arr = this.init (arr); สำหรับ (var i = 0; i <_arr.length; i ++) {var one = _arr [i] .toString (2), v = one.match (/^1+? (? = 0)/); if (v && one.length == 8) {var bytesLength = v [0] .length; var store = _arr [i] .tostring (2) .slice (7 - byteslength); สำหรับ (var st = 1; st <bytesLength; st ++) {store += _arr [st +i] .toString (2) .slice (2)} utf += string.fromCharcode (parseint (เก็บ, 2)); i += bytesLength - 1} else {utf += string.fromCharcode (_arr [i])}} return utf} readutf ([0, 3, 228, 184, 173]); => 'ใน'อีกวิธีหนึ่งในการแยกวิเคราะห์ภาษาจีนเพื่อรับ UTF8 bytecode
อีกวิธีที่ค่อนข้างง่ายในการแปลงภาษาจีนเป็น UTF8 bytecode นั้นค่อนข้างง่าย เบราว์เซอร์ยังมีวิธีการและทุกคนใช้วิธีนี้ มันคืออะไร? มันคือ encodeuri แน่นอนว่า encodeuricomponent ก็โอเคเช่นกัน
ถูกต้องนั่นคือวิธีการ ดังนั้นวิธีนี้จะแปลงภาษาจีนที่เข้ารหัสแบบ Unicode เป็น UTF8 bytecode ได้อย่างไร
var str = ''; var code = encodeuri (str); console.log (รหัส); // =>%โฆษณา B8%
คุณพบว่าฉันได้รับสตริงที่หลบหนีและเนื้อหาในสตริงนี้เหมือนกับ bytecode ที่ฉันได้รับมาก่อนหน้านี้
ต่อไปเราจะแปลง AD%E4%B8%เป็นอาร์เรย์ตัวเลข
var codelist = code.split ('%'); codelist = codelist.map (item => parseint (รายการ, 16)); console.log (codelist); // => [228, 184, 173]เรียบง่ายมี ~~~
หลักการของวิธีง่ายๆนี้คืออะไร?
นี่คือปัญหาของการเข้ารหัส QueryString ใน URIS เนื่องจากตามกฎระเบียบ querystring ใน URI จะต้องส่งตามการเข้ารหัส UTF8 และ JavaScript เป็น Unicode ดังนั้นเบราว์เซอร์จึงให้วิธีการของเรานั่นคือวิธีการเข้ารหัส/encodeuricomponent วิธีนี้จะอธิบาย
ตัวละครที่ไม่ใช่ภาษาอังกฤษ (นี่ถือว่าเป็นตัวละครที่ไม่ใช่ภาษาอังกฤษ?) ถูกแปลงเป็น UTF8 bytecode เป็นครั้งแรกและเพิ่ม%ไว้ด้านหน้าเพื่อแยกพวกเขาดังนั้นเราจึงหลบหนีตัวละครจีน "中" และได้รับ "%E4%B8%โฆษณา"
นั่นคือหลักการทั้งหมดไม่มีอะไรอื่น
อย่างไรก็ตามวิธีนี้มีข้อเสียอีกประการหนึ่งนั่นคือมันจะหลบหนีจากตัวละครที่ไม่ใช่ภาษาอังกฤษเท่านั้นดังนั้นเมื่อเราต้องการจัดรูปแบบอักขระภาษาอังกฤษลงในการเข้ารหัส UTF8 วิธีนี้ไม่สามารถตอบสนองความต้องการของเราได้และเรายังต้องหลบหนีอักขระภาษาอังกฤษ
แล้วฉันควรทำอย่างไรเมื่อต้องการวิเคราะห์ เพียงใช้ decodeuri/decodeuricomponent
var codelist = [228, 184, 173]; var code = codelist.map (item => '%'+item.toString (16)). เข้าร่วม (''); decodeuri (รหัส); -โอเคบทความนี้จะแนะนำการเข้ารหัส UTF8
ฉันหวังว่ามันจะช่วยให้คุณเข้าใจหลักการของการเข้ารหัส UTF-8
ข้างต้นเป็นวิธีการใช้งานทั้งหมดสำหรับการเข้ารหัส UTF-8 ผ่าน JavaScript ที่มาถึงคุณ ฉันหวังว่าทุกคนจะสนับสนุน wulin.com เพิ่มเติม ~