JavaScriptを使用して文字列のディスクサイズを推定するにはどうすればよいですか?
-
29-09-2019 - |
質問
推定しようとする必要があります ディスク JavaScriptのテキスト文字列(RAWテキストまたは画像/オーディオ/などのBase64エンコード文字列)のサイズ。これを推定する方法がわかりません。私が見つけることができるグーグルの唯一のことはです .length
だから私は多分stackoverflowの誰かが知っているかもしれないと思った...
私が知る必要がある理由は、ユーザーが5MB(またはIEで10MB)に近づいているときに確認する機能を必要とする(または持ちたい)ローカルストレージスクリプトを持っていることであり、ドメインの最大サイズを増やすように促すことです。 。したがって、ユーザーがヒットした場合、たとえば4.5MBのデータがプロンプトしました
ブラウザ5MBデータキャップに近づいています。最大データを増やしてください... ブラウザのためにそれを増やす手順
解決
正確ではありませんが、文字列内のバイト数をカウントして大まかな推定を取得できます。
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を使用すると、文字列内の文字に依存します。 (1バイトのみを取得しますが、最大4バイトのバイトを取ることができます。)Base64エンコードデータを扱っている場合、文字はすべてASCII範囲内にあるため、ディスク上のstr.lengthバイトを占有します。最初にそれらをデコードしてバイナリとして保存すると、(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
執筆以来何かが変更されていない限り、ローカルストレージがドメインごとに5MBに制限されているため、ユーザーがそれを増やす方法がないので、あなたが何ができるかはわかりません。
あなたがメモリの使用について話しているなら、いいえ。これは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);