سؤال

أحتاج إلى تحويل سلاسل UTF-8 الكبيرة إلى ASCII.يجب أن تكون قابلة للعكس، ومن الناحية المثالية خوارزمية سريعة/خفيفة الوزن.

كيف يمكنني أن أفعل هذا؟أحتاج ال مصدر الكود (باستخدام الحلقات) أو جافا سكريبت شفرة.(لا ينبغي أن يعتمد على أي نظام أساسي/إطار عمل/مكتبة)

يحرر: أدرك أن تمثيل ASCII لن يبدو صحيحًا وسيكون أكبر (من حيث البايتات) من نظيره UTF-8، نظرًا لأنه شكل مشفر من UTF-8 الأصلي.

هل كانت مفيدة؟

المحلول

يمكنك استخدام إصدار ASCII فقط من دالة الاقتباس json2.js الخاصة بـ Douglas Crockford.والتي سوف تبدو مثل هذا:

    var escapable = /[\\\"\x00-\x1f\x7f-\uffff]/g,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };

    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    }

سيؤدي هذا إلى إنتاج ASCII صالح فقط، ومقتبس جافا سكريبت لسلسلة الإدخال

على سبيل المثال quote("Doppelgänger!") سيكون "Doppelg\u00e4nger!"

لإرجاع الترميز يمكنك فقط تقييم النتيجة

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);

نصائح أخرى

أي سلسلة UTF-8 قابلة للتحويل إلى ASCII هي بالفعل ASCII.

يمكن أن يمثل UTF-8 أي حرف Unicode، بينما لا يستطيع ASCII ذلك.

كما قال الآخرون، لا يمكنك تحويل نص UTF-8/عادي إلى نص ASCII/عادي دون إسقاط البيانات.

يمكنك تحويل نص UTF-8/عادي إلى تنسيق ASCII آخر.على سبيل المثال، يتيح HTML لأي حرف في UTF-8 أن يتم تمثيله في ملف بيانات ASCII باستخدام مراجع الأحرف.

إذا واصلنا هذا المثال، في JavaScript، charCodeAt يمكن أن يساعد في تحويل سلسلة إلى تمثيل لها باستخدام مراجع أحرف HTML.

يتم اتباع نهج آخر من قبل عناوين URL, ، وتنفيذها في JS مثل encodeURIComponent.

طلبك غريب جداً

سيؤدي تحويل UTF-8 إلى ASCII إلى فقدان جميع المعلومات حول نقاط تشفير Unicode > 127 (أي.كل ما هو ليس في ASCII).

ومع ذلك، يمكنك محاولة تشفير بيانات Unicode الخاصة بك (بغض النظر عن تشفير المصدر) بتشفير متوافق مع ASCII، مثل UTF-7.وهذا يعني أن البيانات التي يتم إنتاجها يمكن تفسيرها قانونيًا على أنها ASCII، ولكنها في الواقع UTF-7.

إذا تم ترميز السلسلة كـ UTF-8، فهي لم تعد سلسلة بعد الآن.إنها بيانات ثنائية، وإذا كنت تريد تمثيل البيانات الثنائية كـ ASCII، فيجب عليك تنسيقها في سلسلة يمكن تمثيلها باستخدام مجموعة أحرف ASCII المحدودة.

إحدى الطرق هي استخدام الترميز الأساسي 64 (مثال في C#):

string original = "asdf";
// encode the string into UTF-8 data:
byte[] encodedUtf8 = Encoding.UTF8.GetBytes(original);
// format the data into base-64:
string base64 = Convert.ToBase64String(encodedUtf8);

إذا كنت تريد ترميز السلسلة كبيانات ASCII:

// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);

هل تريد تجريد كافة الأحرف غير ascii (الشرطة المائلة واستبدالها بـ "؟"، وما إلى ذلك) أو تخزين نقاط كود Unicode في نظام غير Unicode؟

أولاً يمكن القيام بذلك في حلقة التحقق من القيم > 128 واستبدالها.

إذا كنت لا ترغب في استخدام "أي نظام أساسي/إطار عمل/مكتبة"، فستحتاج إلى كتابة برنامج التشفير الخاص بك.وإلا فإنني سأستخدم فقط .html() الخاص بـ JQuery؛

فمن المستحيل يتحول سلسلة UTF-8 إلى ASCII ولكن من الممكن ترميز Unicode كسلسلة متوافقة مع ASCII.

ربما تريد استخدامها بونيكود - هذا هو بالفعل ترميز Unicode القياسي الذي يقوم بتشفير كافة أحرف Unicode في ASCII.للحصول على كود جافا سكريبت، تحقق من هذا سؤال

يرجى تعديل عنوان سؤالك ووصفه لمنع الآخرين من التصويت ضده - لا تستخدم تحويل المصطلح، استخدم الترميز.

Here is a function to convert UTF8 accents to ASCII Accents (àéèî etc) If there is an accent in the string it's converted to %239 for exemple Then on the other side, I parse the string and I know when there is an accent and what is the ASCII char.

لقد استخدمته في برنامج جافا سكريبت لإرسال البيانات إلى وحدة تحكم دقيقة تعمل في ASCII.

convertUtf8ToAscii = function (str) {
    var asciiStr = "";
    var refTable = { // Reference table Unicode vs ASCII
        199: 128, 252: 129, 233: 130, 226: 131, 228: 132, 224: 133, 231: 135, 234: 136, 235: 137, 232: 138,
        239: 139, 238: 140, 236: 141, 196: 142, 201: 144, 244: 147, 246: 148, 242: 149, 251: 150, 249: 151
    };
    for(var i = 0; i < str.length; i++){
        var ascii = refTable[str.charCodeAt(i)];
        if (ascii != undefined)
            asciiStr += "%" +ascii;
        else
            asciiStr += str[i];
    }
    return asciiStr;
}

تنفيذاً لل quote() الوظيفة قد تفعل ما تريد.نسختي يمكن العثور عليها هنا

يمكنك استخدام eval() لعكس الترميز:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top