سؤال

أحتاج إلى محاولة تقدير قرص حجم سلسلة نصية (يمكن أن يكون نصًا خامًا أو سلسلة مشفرة BASE64 لصورة/صوت/إلخ) في JavaScript. لست متأكدًا من كيفية تقدير هذا. الشيء الوحيد عندما أجده googling هو .length لذلك اعتقدت أن شخصًا ما على Stackoverflow قد يعرف ...

السبب في أنني بحاجة إلى معرفتي هو أن لديّ برنامج نصي محلي يحتاج (أو أحب أن يكون) القدرة على التحقق من الوقت الذي يقترب فيه المستخدم من 5 ميجابايت (أو 10 ميجابايت في IE) ويطالبهم بزيادة حجم الحد الأقصى للمجال . لذلك ، إذا ضرب المستخدم ، فإنه يتيح أن نقول ، 4.5 ميجابايت من البيانات التي يطالب بها

أنت تقترب من غطاء بيانات المتصفحات 5MB. يرجى زيادة بيانات Max الخاصة بك بواسطة ... تعليمات بشأن زيادة ذلك للمتصفح

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

المحلول

لن يكون هذا دقيقًا ، ولكن يمكنك حساب عدد البايتات في سلسلة للحصول على تقدير تقريبي.

function bytes(string) {
    var escaped_string = encodeURI(string);
    if (escaped_string.indexOf("%") != -1) {
        var count = escaped_string.split("%").length - 1;
        count = count == 0 ? 1 : count;
        count = count + (escaped_string.length - (count * 3));
    }
    else {
        count = escaped_string.length;
    }

return count;

}

var mystring = 'tâ' ؛ تنبيه (بايت (mystring)) ؛

نصائح أخرى

سوف يعتمد على ترميز شخصيتك. إذا كنت تستخدم ترميز ASCII ، فسيكون بايت Str.length. إذا كنت تستخدم UTF-16 ، فسيكون (str.length * 2) بايت. إذا كنت تستخدم UTF-8 ، فسوف يعتمد على الأحرف الموجودة في السلسلة. (ستستغرق بعض الشخصيات بايت واحد فقط ، ولكن يمكن أن يستغرق البعض الآخر ما يصل إلى 4 بايت.) إذا كنت تتعامل مع البيانات المشفرة BASE64 ، فإن الشخصيات كلها ضمن نطاق ASCII ، وبالتالي ستشغل بايتات الطول على القرص. إذا قمت بفك تشفيرها أولاً وحفظها على أنها ثنائية ، فسوف يستغرق الأمر (Str.length * 3/4) بايت. (مع BASE64 ، 3 بايت غير مشفرة تصبح 4 بايتات مشفرة.)

راجع للشغل - إذا لم تكن قد قرأت جويل سبولسكي الحد الأدنى المطلق لكل مطور برامج على الإطلاق ، ويجب أن يعرف بشكل إيجابي عن مجموعات Unicode والمجموعات الشخصية (بدون أعذار!), ، يجب أن تفعل ذلك على الفور.

http://www.joelonsoftware.com/articles/unicode.html

تحديث: إذا كنت تستخدم LocalStorage ، أفترض أنك على دراية بـ window.localStorage.Length ، على الرغم من أن هذا يخبرك فقط بالمبلغ الذي تم استخدامه ، وليس ما إذا كانت بياناتك الجديدة ستناسب. أود أن أوصي بشدة القراءة الغوص في HTML5, ، وخاصة قسم التخزين:

http://diveintohtml5.ep.io/storage.html

ما لم يتغير شيء ما منذ كتابته ، لست متأكدًا مما يمكنك القيام به حيث يحدك LocalStorage إلى 5 ميغابايت لكل مجال دون أي وسيلة للمستخدم لزيادةه.

إذا كنت تتحدث عن استخدام الذاكرة ، فلا. لا توجد طريقة لتحديد الذاكرة المستخدمة بشكل موثوق (على الأقل التنفيذ بشكل مستقل) ، لأن هذا ليس جزءًا من مواصفات ECMASCRIPT. ذلك يعتمد على ترميز شخصيتك.

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

لقد وجدت حلاً (على الرغم من أنه يبدو قليلاً) هنا

 function checkLength() {
    var countMe = document.getElementById("someText").value
    var escapedStr = encodeURI(countMe)
    if (escapedStr.indexOf("%") != -1) {
        var count = escapedStr.split("%").length - 1
        if (count == 0) count++  //perverse case; can't happen with real UTF-8
        var tmp = escapedStr.length - (count * 3)
        count = count + tmp
    } else {
        count = escapedStr.length
    }
    alert(escapedStr + ": size is " + count)
 }

يمكنك حساب عدد البايتات في سلسلة بهذه الطريقة البسيطة والدقيقة

var head = 'data:image/png;base64,';
var imgFileSize = Math.round((string.length - head.length)*3/4) ;

console.log("size is ",imgFileSize);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top