javascript - كيف يمكنني تحويل أحرف UTF-8 خاصة إلى ما يعادل ISO 8859-1 باستخدام جافا سكريبت؟




3 Answers

تكمن المشكلة في أنه بمجرد تقديم الصفحة ، سيكون المحتوى في الترميز الموضح في العلامة الوصفية لنوع المحتوى. محتوى الترميز "الخاطئ" مشوه بالفعل.

من الأفضل القيام بذلك على الخادم قبل عرض الصفحة. أو كما كنت أعرف أن أقول: UTF-8 نهاية إلى نهاية أو يموت .

javascript jquery character-encoding

أقوم بإنشاء تطبيق javascript الذي يسترد ملفات json مع jquery وحقن البيانات في صفحة الويب المضمنة فيها.

يتم تشفير ملفات .json باستخدام UTF-8 وتحتوي على أحرف محركة مثل é و ö و å.

المشكلة هي أنني لا أتحكم في مجموعة الأحرف على الصفحات التي ستستخدم التطبيق.

سيستخدم البعض UTF-8 ، لكن البعض الآخر سيستخدم الحائز iso-8859-1. هذا بالطبع سيعثر على الأحرف الخاصة من ملفات .json.

كيف يمكنني تحويل أحرف UTF-8 خاصة إلى ما يعادل ISO 8859-1 باستخدام جافا سكريبت؟




نظرًا لأن question حول كيفية التحويل من ISO-8859-1 إلى UTF-8 مغلق نظرًا لأنني سأقوم بنشر الحل الخاص بي هنا.

تكون المشكلة عند محاولة الحصول على أي شيء باستخدام XMLHttpRequest ، إذا كان XMLHttpRequest.responseType هو "نص" أو فارغًا ، يتم تحويل XMLHttpRequest.response إلى DOMString و قد تم تقسيم العناصر. بعد ذلك ، يكاد يكون من المستحيل العمل بشكل موثوق به مع تلك السلسلة.

الآن ، إذا كان المحتوى من الخادم هو ISO-8859-1 ، فسيتعين عليك إجبار الاستجابة على أن تكون من النوع " Blob " وتحويلها لاحقًا إلى DOMSTring. فمثلا:

var ajax = new XMLHttpRequest();
ajax.open('GET', url, true);
ajax.responseType = 'blob';
ajax.onreadystatechange = function(){
    ...
    if(ajax.responseType === 'blob'){
        // Convert the blob to a string
        var reader = new window.FileReader();
        reader.addEventListener('loadend', function() {
           // For ISO-8859-1 there's no further conversion required
           Promise.resolve(reader.result);
        });
        reader.readAsBinaryString(ajax.response);
    }
}

يبدو أن السحر يحدث على readAsBinaryString لذلك ربما يمكن لأحد أن يلقي بعض الضوء على لماذا يعمل هذا.




يجب عليك إضافة هذا السطر فوق صفحتك

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />



Related