145 lines
3.8 KiB
JavaScript
145 lines
3.8 KiB
JavaScript
(function(){
|
|
|
|
if (undefined !== String.prototype.fromUtf8 &&
|
|
undefined !== String.prototype.toUtf8)
|
|
return;
|
|
|
|
var STRING_UTF8_BUFFER_LENGTH = 1024;
|
|
var STRING_UTF8_BUFFER = new ArrayBuffer(STRING_UTF8_BUFFER_LENGTH);
|
|
|
|
/**
|
|
* Read string from utf8
|
|
* @param {Uint8Array} buffer
|
|
* @param {number} [start=0]
|
|
* @param {number} [len]
|
|
* @returns {string}
|
|
*/
|
|
String.prototype.fromUtf8 = function(buffer, start, len) {
|
|
if (undefined === start)
|
|
start = 0;
|
|
if (undefined === len)
|
|
len = buffer.length - start;
|
|
|
|
var result = "";
|
|
var index = start;
|
|
var end = start + len;
|
|
while (index < end)
|
|
{
|
|
var u0 = buffer[index++];
|
|
if (!(u0 & 128))
|
|
{
|
|
result += String.fromCharCode(u0);
|
|
continue;
|
|
}
|
|
var u1 = buffer[index++] & 63;
|
|
if ((u0 & 224) == 192)
|
|
{
|
|
result += String.fromCharCode((u0 & 31) << 6 | u1);
|
|
continue;
|
|
}
|
|
var u2 = buffer[index++] & 63;
|
|
if ((u0 & 240) == 224)
|
|
u0 = (u0 & 15) << 12 | u1 << 6 | u2;
|
|
else
|
|
u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | buffer[index++] & 63;
|
|
if (u0 < 65536)
|
|
result += String.fromCharCode(u0);
|
|
else
|
|
{
|
|
var ch = u0 - 65536;
|
|
result += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
|
|
/**
|
|
* Convert string to utf8 array
|
|
* @returns {Uint8Array}
|
|
*/
|
|
String.prototype.toUtf8 = function(isNoEndNull, isUseBuffer) {
|
|
var inputLen = this.length;
|
|
var testLen = 6 * inputLen + 1;
|
|
var tmpStrings = (isUseBuffer && testLen < STRING_UTF8_BUFFER_LENGTH) ? STRING_UTF8_BUFFER : new ArrayBuffer(testLen);
|
|
|
|
var code = 0;
|
|
var index = 0;
|
|
|
|
var outputIndex = 0;
|
|
var outputDataTmp = new Uint8Array(tmpStrings);
|
|
var outputData = outputDataTmp;
|
|
|
|
while (index < inputLen)
|
|
{
|
|
code = this.charCodeAt(index++);
|
|
if (code >= 0xD800 && code <= 0xDFFF && index < inputLen)
|
|
code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & this.charCodeAt(index++)));
|
|
|
|
if (code < 0x80)
|
|
outputData[outputIndex++] = code;
|
|
else if (code < 0x0800)
|
|
{
|
|
outputData[outputIndex++] = 0xC0 | (code >> 6);
|
|
outputData[outputIndex++] = 0x80 | (code & 0x3F);
|
|
}
|
|
else if (code < 0x10000)
|
|
{
|
|
outputData[outputIndex++] = 0xE0 | (code >> 12);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | (code & 0x3F);
|
|
}
|
|
else if (code < 0x1FFFFF)
|
|
{
|
|
outputData[outputIndex++] = 0xF0 | (code >> 18);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 12) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | (code & 0x3F);
|
|
}
|
|
else if (code < 0x3FFFFFF)
|
|
{
|
|
outputData[outputIndex++] = 0xF8 | (code >> 24);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 18) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 12) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | (code & 0x3F);
|
|
}
|
|
else if (code < 0x7FFFFFFF)
|
|
{
|
|
outputData[outputIndex++] = 0xFC | (code >> 30);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 24) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 18) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 12) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | ((code >> 6) & 0x3F);
|
|
outputData[outputIndex++] = 0x80 | (code & 0x3F);
|
|
}
|
|
}
|
|
|
|
if (isNoEndNull !== true)
|
|
outputData[outputIndex++] = 0;
|
|
|
|
return new Uint8Array(tmpStrings, 0, outputIndex);
|
|
};
|
|
|
|
function StringPointer(pointer, len)
|
|
{
|
|
this.ptr = pointer;
|
|
this.length = len;
|
|
}
|
|
StringPointer.prototype.free = function()
|
|
{
|
|
if (0 !== this.ptr)
|
|
Module["_free"](this.ptr);
|
|
};
|
|
|
|
String.prototype.toUtf8Pointer = function(isNoEndNull) {
|
|
var tmp = this.toUtf8(isNoEndNull, true);
|
|
var pointer = Module["_malloc"](tmp.length);
|
|
if (0 == pointer)
|
|
return null;
|
|
|
|
Module["HEAP8"].set(tmp, pointer);
|
|
return new StringPointer(pointer, tmp.length);
|
|
};
|
|
|
|
})();
|