مجموعة حرف JavaScript:
تتم كتابة برامج JavaScript باستخدام مجموعات أحرف Unicode. Unicode هي مجموعة من 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 التي تم إنشاؤها بواسطة JavaScript إلى سلسلة مشفرة UTF-8
كما هو مذكور في العنوان ، سيناريو التطبيق شائع جدًا. على سبيل المثال ، عند إرسال ثنائي إلى الخادم ، ينص الخادم على أن ترميز المحتوى الثنائي يجب أن يكون UTF-8. في هذه الحالة ، يجب علينا تحويل سلسلة Unicode من JavaScript إلى سلسلة مشفرة UTF-8 من خلال البرنامج.
طريقة التحويل
قبل التحويل ، يجب أن نفهم أن بنية ترميز Unicode ثابتة.
إذا كنت لا تصدق ذلك ، فيمكنك تجربة طريقة charcodeat للسلسلة لمعرفة عدد البايتات التي يتم تشغيلها.
• اللغة الإنجليزية تحتل شخصية واحدة وتشغل الشخصيات الصينية حرفين
ومع ذلك ، يتم تحديد طول بنية ترميز UTF-8 بحجم حرف واحد.
فيما يلي حجم حرف واحد يأخذ عدة بايت. الحد الأقصى للطول بعد حرف Unicode واحد هو 6 بايت.
• 1 بايت: رمز يونيكود هو 0 - 127
• 2 بايت: رمز يونيكود هو 128 - 2047
• 3 بايت: رمز Unicode هو 2048 - 0xffff
• 4 بايت: رمز Unicode هو 65536 - 0x1fffff
• 5 بايت: رمز Unicode هو 0x200000 - 0x3ffffff
• 6 بايت: رمز Unicode هو 0x4000000 - 0x7fffffff
للحصول على تفاصيل ، يرجى الاطلاع على الصورة:
نظرًا لأن رموز Unicode ذات الأحرف الإنجليزية والإنجليزية هي 0 - 127 ، فإن طول البايت والبايت باللغة الإنجليزية في Unicode و UTF -8 متماثلان ، ولا يشغلون سوى بايت واحد. هذا هو السبب في 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 للشخصية الصينية "In" هو 20013. ثم نجد أن 20013 يقع في الفاصل 2048 - 0xFFFF ، وبالتالي فإن الشخصية الصينية "في" يجب أن تشغل 3 بايت في UTF8.
3. تكمل
نظرًا لأننا نعلم أن الشخصية الصينية "أنا" تحتاج إلى احتلال 3 بايت ، كيف يمكننا الحصول على هذه البايتات الثلاثة؟
هذا يتطلب تصميم الرمز المكملة. منطق الرمز التكميلي المحدد هو كما يلي:
حسنًا ، أعلم أنك لا تستطيع فهم هذه الصورة ، لذلك سأتحدث عنها!
رمز التعبئة المحدد هو كما يلي ، "X" يشير إلى المساحة الفارغة ، المستخدمة للملء.
• 0xxxxxxx
• 110xxxxx 10xxxxxx
• 1110xxxx 10xxxxxx 10xxxxx
• 11110xxx 10xxxxxx 10xxxxxxxxxxxxx
• 111110xx 10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
• 1111110x 10xxxxxx 10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
تحذير: هل وجدت ذلك؟ يشير البايت الأول لرمز التعبئة إلى عدد البايتات التي يشغلها رمز UTF-8 بالكامل! يتم استخدام هذه الميزة بواسطة UTF-8 Decoded إلى Unicode ~
لنقدم مثالًا بسيطًا أولاً. تحويل الرسالة الإنجليزية "A" إلى UTF8 الترميز.
1. charcode من "A" هو 65
2. 65 في الفاصل بين 0-127 ، لذلك "أ" يحتل بايت واحد
3. تكملة بايت واحد في UTF8 هو 0xxxxxxx. X يمثل موقفا شاغر ويستخدم لتكملة.
4. تحويل 65 إلى ثنائي للحصول على 1000001
5. أضف 1000001 إلى الشواغر من 1xxxxxx بالترتيب من الأمام إلى الخلف ، واحصل على 01000001
6. تحويل 11000001 إلى سلسلة للحصول على "أ"
7. أخيرًا ، "A" مشفر بواسطة UTF8.
مع هذا المثال الصغير ، هل تحققنا مرة أخرى من أن UTF-8 هي مجموعة من Unicode!
حسنًا ، دعنا نعود إلى الشخصية الصينية "الأوسط". قبل ذلك ، حصلنا على charcode من "الأوسط" في عام 20013 والثنائي هو 010011100 00101101. التفاصيل هي كما يلي:
VAR CODE = 20013 ؛ CODE.TOSTRING (2) ؛ // => 10011100101 يعادل 01001110 00101101
ثم ، نتبع طريقة "A" في التعبئة أعلاه لملء الموضع.
تكملة 01001110 00101101 بالترتيب من الأمام إلى الخلف إلى 1110xxxxx 10xxxxxxxxxxxxx. احصل على 11100100 10111000 10101101.
4. احصل على محتوى UTF8 المشفر
من خلال الخطوات المذكورة أعلاه ، نحصل على ثلاثة بايت UTF8 من "In" ، 11100100 10111000 1010110101.
نقوم بتحويل كل بايت إلى سداسي عشري ونحصل على 0xe4 0xb8 0xad ؛
ثم هذا 0xe4 0xb8 0xad هو ترميز UTF8 الذي حصلنا عليه أخيرًا.
نستخدم العازلة NodeJS للتحقق مما إذا كان صحيحًا.
var buffer = new Buffer ('in') ؛ console.log (buffer.length) ؛ // => 3console.log (Buffer) ؛ // => <Buffer E4 B8 AD> // أخيرًا احصل على ثلاثة بايت 0xe4 0xb8 0xadلأن السداسي عشري خالية من الحالات ، هل هو بالضبط كما قمنا بحساب أن 0xe4 0xb8 0xad؟
اكتب منطق ترميز أعلاه إلى وظيفة.
// تنسيق السلسلة في bytes utf8-encoded var trintsf = function (str ، isGetBytes) {var back = [] ؛ var bytesize = 0 ؛ لـ (var i = 0 ؛ i <str.length ؛ i ++) {var code = str.charcodeat (i) ؛ if (0x00 <= code && code <= 0x7f) {bytesize += 1 ؛ back.push (رمز) ؛ } آخر إذا (0x80 <= code && code <= 0x7ff) {bytesize += 2 ؛ back.push ((192 | (31 & (code >> 6)))))) ؛ back.push ((128 | (63 & code)))} آخر إذا ((0x800 <= code && code <= 0xd7ff) || (0xe000 <= code && code <= 0xffff)) {bytesize += 3 ؛ back.push ((224 | (15 & (code >> 12)))) ؛ back.push ((128 | (63 & (code >> 6)))) ؛ back.push ((128 | (63 & code))))}} لـ (i = 0 ؛ i <back.length ؛ i ++) {back [i] & = 0xff ؛ } if (isGetBytes) {return back} if (bytesize <= 0xff) {return [0 ، bytesize] .Concat (back) ؛ } آخر {return [bytesize >> 8 ، bytesize & 0xff] .concat (back) ؛ }} writeutf ('in-on') ؛ // => [0 ، 3 ، 228 ، 184 ، 173] // يمثل الرقمين الأولين طول بايت UTF8 اللاحق. نظرًا لأن الطول هو 3 ، فإن الأولين بايتان هما `0 ، 3` // المحتوى هو` 228 ، 184 ، 173` وتحويله إلى hexadecimal هو `0xe4 0xb8 0xad` // اقرأ بايت UTF8-encoded وهو مصمم خصيصًا لسلسلة unicode var readutf = function (arr) {if (typeof arr === 'string') {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 (store ، 2)) ؛ i += bytesLength - 1} آخر {utf += string.fromcharcode (_arr [i])}} return utf} readutf ([0 ، 3 ، 228 ، 184 ، 173]) ؛ => 'في'طريقة أخرى لتحليل الصينية للحصول على رمز UTF8
طريقة أخرى بسيطة نسبيا لتحويل الصينية إلى UTF8 bytecode بسيطة نسبيا. يوفر المتصفح أيضًا طريقة ، وكان الجميع يستخدمون هذه الطريقة. ما هذا؟ إنه encodeuri. بالطبع ، EncodeUricomponent هو أيضا على ما يرام.
هذا صحيح ، هذه هي الطريقة. فكيف تقوم هذه الطريقة بتحويل صينية مشفرة إلى UNICODE إلى رمز BYTECODE UTF8؟
var str = '' ؛ var code = encodeuri (str) ؛ console.log (code) ؛ // => ٪ E4 ٪ B8 ٪ م
هل وجدت أنني حصلت على سلسلة هاربة ، والمحتوى في هذه السلسلة هو نفسه رمز bytecode الذي حصلت عليه من قبل.
بعد ذلك نقوم بتحويل ٪ E4 ٪ B8 ٪ AD إلى مجموعة عدد.
var codeList = code.split ('٪') ؛ codeList = codeList.map (item => parseint (item ، 16)) ؛ console.log (codeList) ؛ // => [228 ، 184 ، 173]بسيط جدا ، هل هناك أي ~~~
ما هو مبدأ هذه الطريقة البسيطة؟
هذه هي مشكلة تشفير QueryString في URIS. لأنه وفقًا للوائح ، يجب أن يتم نقل QueryString في URI وفقًا لترميز UTF8 ، و javaScript unicode ، لذلك يوفر لنا المتصفح طريقة ، أي طريقة Encodeuri/EncodeUricomponent. سيتم شرح هذه الطريقة
يتم تحويل الشخصيات غير الإنجليزية (هذا ، لماذا يتم تحويل الشخصيات غير الإنجليزية؟) أولاً إلى رمز Bytode UTF8 ، ثم أضافوا ٪ في المقدمة لتصحيحها ، لذلك هربنا من الشخصية الصينية "中" وحصلنا على "٪ E4 ٪ B8 ٪ AD".
حسنًا ، هذا كل المبادئ ، لا شيء آخر.
ومع ذلك ، فإن هذه الطريقة لها عيب آخر ، أي أنها ستهرب فقط من الشخصيات غير الإنجليزية ، لذلك عندما نحتاج إلى تنسيق الأحرف الإنجليزية في ترميز UTF8 ، لا يمكن لهذه الطريقة تلبية احتياجاتنا ، ونحن بحاجة أيضًا إلى الهروب من الأحرف الإنجليزية.
إذن ماذا أفعل عندما أريد تحليله؟ فقط استخدم decodeuri/decodeuricomponent.
var codeList = [228 ، 184 ، 173] ؛ var code = codeList.map (item => '٪'+item.ToString (16)). // =>
حسنًا ، ستقدم هذه المقالة ترميز UTF8.
آمل أن يساعدك في فهم مبادئ ترميز UTF-8.
ما سبق هو كل طرق التنفيذ لترميز UTF-8 من خلال جافا سكريبت التي تم تقديمها إليك. آمل أن يدعم الجميع wulin.com أكثر ~