node-red-node-email
Version:
Node-RED nodes to send and receive simple emails.
2,217 lines (1,975 loc) • 297 kB
JavaScript
/*!
* encoding-japanese v2.2.0 - Convert and detect character encoding in JavaScript
* Copyright (c) 2012 polygonplanet <polygon.planet.aqua@gmail.com>
* https://github.com/polygonplanet/encoding.js
* @license MIT
*/
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Encoding = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports={
"version": "2.2.0"
}
},{}],2:[function(require,module,exports){
var util = require('./util');
var EncodingTable = require('./encoding-table');
// Fallback character when a character can't be represented
exports.FALLBACK_CHARACTER = 63; // '?'
var HAS_TYPED = exports.HAS_TYPED = typeof Uint8Array !== 'undefined' && typeof Uint16Array !== 'undefined';
// Test for String.fromCharCode.apply
var CAN_CHARCODE_APPLY = false;
var CAN_CHARCODE_APPLY_TYPED = false;
try {
if (String.fromCharCode.apply(null, [0x61]) === 'a') {
CAN_CHARCODE_APPLY = true;
}
} catch (e) {}
if (HAS_TYPED) {
try {
if (String.fromCharCode.apply(null, new Uint8Array([0x61])) === 'a') {
CAN_CHARCODE_APPLY_TYPED = true;
}
} catch (e) {}
}
exports.CAN_CHARCODE_APPLY = CAN_CHARCODE_APPLY;
exports.CAN_CHARCODE_APPLY_TYPED = CAN_CHARCODE_APPLY_TYPED;
// Function.prototype.apply stack max range
exports.APPLY_BUFFER_SIZE = 65533;
exports.APPLY_BUFFER_SIZE_OK = null;
var EncodingNames = exports.EncodingNames = {
UTF32: {
order: 0
},
UTF32BE: {
alias: ['UCS4']
},
UTF32LE: null,
UTF16: {
order: 1
},
UTF16BE: {
alias: ['UCS2']
},
UTF16LE: null,
BINARY: {
order: 2
},
ASCII: {
order: 3,
alias: ['ISO646', 'CP367']
},
JIS: {
order: 4,
alias: ['ISO2022JP']
},
UTF8: {
order: 5
},
EUCJP: {
order: 6
},
SJIS: {
order: 7,
alias: ['CP932', 'MSKANJI', 'WINDOWS31J']
},
UNICODE: {
order: 8
}
};
var EncodingAliases = {};
exports.EncodingAliases = EncodingAliases;
exports.EncodingOrders = (function() {
var aliases = EncodingAliases;
var names = util.objectKeys(EncodingNames);
var orders = [];
var name, encoding, j, l;
for (var i = 0, len = names.length; i < len; i++) {
name = names[i];
aliases[name] = name;
encoding = EncodingNames[name];
if (encoding != null) {
if (encoding.order != null) {
orders[orders.length] = name;
}
if (encoding.alias) {
// Create encoding aliases
for (j = 0, l = encoding.alias.length; j < l; j++) {
aliases[encoding.alias[j]] = name;
}
}
}
}
orders.sort(function(a, b) {
return EncodingNames[a].order - EncodingNames[b].order;
});
return orders;
}());
function init_JIS_TO_UTF8_TABLE() {
if (EncodingTable.JIS_TO_UTF8_TABLE === null) {
EncodingTable.JIS_TO_UTF8_TABLE = {};
var keys = util.objectKeys(EncodingTable.UTF8_TO_JIS_TABLE);
var i = 0;
var len = keys.length;
var key, value;
for (; i < len; i++) {
key = keys[i];
value = EncodingTable.UTF8_TO_JIS_TABLE[key];
if (value > 0x5F) {
EncodingTable.JIS_TO_UTF8_TABLE[value] = key | 0;
}
}
EncodingTable.JISX0212_TO_UTF8_TABLE = {};
keys = util.objectKeys(EncodingTable.UTF8_TO_JISX0212_TABLE);
len = keys.length;
for (i = 0; i < len; i++) {
key = keys[i];
value = EncodingTable.UTF8_TO_JISX0212_TABLE[key];
EncodingTable.JISX0212_TO_UTF8_TABLE[value] = key | 0;
}
}
}
exports.init_JIS_TO_UTF8_TABLE = init_JIS_TO_UTF8_TABLE;
},{"./encoding-table":5,"./util":12}],3:[function(require,module,exports){
var config = require('./config');
var util = require('./util');
var EncodingDetect = require('./encoding-detect');
var EncodingTable = require('./encoding-table');
/**
* JIS to SJIS
*/
function JISToSJIS(data) {
var results = [];
var index = 0;
var i = 0;
var len = data && data.length;
var b1, b2;
for (; i < len; i++) {
// escape sequence
while (data[i] === 0x1B) {
if ((data[i + 1] === 0x24 && data[i + 2] === 0x42) ||
(data[i + 1] === 0x24 && data[i + 2] === 0x40)) {
index = 1;
} else if ((data[i + 1] === 0x28 && data[i + 2] === 0x49)) {
index = 2;
} else if (data[i + 1] === 0x24 && data[i + 2] === 0x28 &&
data[i + 3] === 0x44) {
index = 3;
i++;
} else {
index = 0;
}
i += 3;
if (data[i] === void 0) {
return results;
}
}
if (index === 1) {
b1 = data[i];
b2 = data[++i];
if (b1 & 0x01) {
b1 >>= 1;
if (b1 < 0x2F) {
b1 += 0x71;
} else {
b1 -= 0x4F;
}
if (b2 > 0x5F) {
b2 += 0x20;
} else {
b2 += 0x1F;
}
} else {
b1 >>= 1;
if (b1 <= 0x2F) {
b1 += 0x70;
} else {
b1 -= 0x50;
}
b2 += 0x7E;
}
results[results.length] = b1 & 0xFF;
results[results.length] = b2 & 0xFF;
} else if (index === 2) {
results[results.length] = data[i] + 0x80 & 0xFF;
} else if (index === 3) {
// Shift_JIS cannot convert JIS X 0212:1990.
results[results.length] = config.FALLBACK_CHARACTER;
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.JISToSJIS = JISToSJIS;
/**
* JIS to EUCJP
*/
function JISToEUCJP(data) {
var results = [];
var index = 0;
var len = data && data.length;
var i = 0;
for (; i < len; i++) {
// escape sequence
while (data[i] === 0x1B) {
if ((data[i + 1] === 0x24 && data[i + 2] === 0x42) ||
(data[i + 1] === 0x24 && data[i + 2] === 0x40)) {
index = 1;
} else if ((data[i + 1] === 0x28 && data[i + 2] === 0x49)) {
index = 2;
} else if (data[i + 1] === 0x24 && data[i + 2] === 0x28 &&
data[i + 3] === 0x44) {
index = 3;
i++;
} else {
index = 0;
}
i += 3;
if (data[i] === void 0) {
return results;
}
}
if (index === 1) {
results[results.length] = data[i] + 0x80 & 0xFF;
results[results.length] = data[++i] + 0x80 & 0xFF;
} else if (index === 2) {
results[results.length] = 0x8E;
results[results.length] = data[i] + 0x80 & 0xFF;
} else if (index === 3) {
results[results.length] = 0x8F;
results[results.length] = data[i] + 0x80 & 0xFF;
results[results.length] = data[++i] + 0x80 & 0xFF;
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.JISToEUCJP = JISToEUCJP;
/**
* SJIS to JIS
*/
function SJISToJIS(data) {
var results = [];
var index = 0;
var len = data && data.length;
var i = 0;
var b1, b2;
var esc = [
0x1B, 0x28, 0x42,
0x1B, 0x24, 0x42,
0x1B, 0x28, 0x49
];
for (; i < len; i++) {
b1 = data[i];
if (b1 >= 0xA1 && b1 <= 0xDF) {
if (index !== 2) {
index = 2;
results[results.length] = esc[6];
results[results.length] = esc[7];
results[results.length] = esc[8];
}
results[results.length] = b1 - 0x80 & 0xFF;
} else if (b1 >= 0x80) {
if (index !== 1) {
index = 1;
results[results.length] = esc[3];
results[results.length] = esc[4];
results[results.length] = esc[5];
}
b1 <<= 1;
b2 = data[++i];
if (b2 < 0x9F) {
if (b1 < 0x13F) {
b1 -= 0xE1;
} else {
b1 -= 0x61;
}
if (b2 > 0x7E) {
b2 -= 0x20;
} else {
b2 -= 0x1F;
}
} else {
if (b1 < 0x13F) {
b1 -= 0xE0;
} else {
b1 -= 0x60;
}
b2 -= 0x7E;
}
results[results.length] = b1 & 0xFF;
results[results.length] = b2 & 0xFF;
} else {
if (index !== 0) {
index = 0;
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
results[results.length] = b1 & 0xFF;
}
}
if (index !== 0) {
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
return results;
}
exports.SJISToJIS = SJISToJIS;
/**
* SJIS to EUCJP
*/
function SJISToEUCJP(data) {
var results = [];
var len = data && data.length;
var i = 0;
var b1, b2;
for (; i < len; i++) {
b1 = data[i];
if (b1 >= 0xA1 && b1 <= 0xDF) {
results[results.length] = 0x8E;
results[results.length] = b1;
} else if (b1 >= 0x81) {
b2 = data[++i];
b1 <<= 1;
if (b2 < 0x9F) {
if (b1 < 0x13F) {
b1 -= 0x61;
} else {
b1 -= 0xE1;
}
if (b2 > 0x7E) {
b2 += 0x60;
} else {
b2 += 0x61;
}
} else {
if (b1 < 0x13F) {
b1 -= 0x60;
} else {
b1 -= 0xE0;
}
b2 += 0x02;
}
results[results.length] = b1 & 0xFF;
results[results.length] = b2 & 0xFF;
} else {
results[results.length] = b1 & 0xFF;
}
}
return results;
}
exports.SJISToEUCJP = SJISToEUCJP;
/**
* EUCJP to JIS
*/
function EUCJPToJIS(data) {
var results = [];
var index = 0;
var len = data && data.length;
var i = 0;
var b;
// escape sequence
var esc = [
0x1B, 0x28, 0x42,
0x1B, 0x24, 0x42,
0x1B, 0x28, 0x49,
0x1B, 0x24, 0x28, 0x44
];
for (; i < len; i++) {
b = data[i];
if (b === 0x8E) {
if (index !== 2) {
index = 2;
results[results.length] = esc[6];
results[results.length] = esc[7];
results[results.length] = esc[8];
}
results[results.length] = data[++i] - 0x80 & 0xFF;
} else if (b === 0x8F) {
if (index !== 3) {
index = 3;
results[results.length] = esc[9];
results[results.length] = esc[10];
results[results.length] = esc[11];
results[results.length] = esc[12];
}
results[results.length] = data[++i] - 0x80 & 0xFF;
results[results.length] = data[++i] - 0x80 & 0xFF;
} else if (b > 0x8E) {
if (index !== 1) {
index = 1;
results[results.length] = esc[3];
results[results.length] = esc[4];
results[results.length] = esc[5];
}
results[results.length] = b - 0x80 & 0xFF;
results[results.length] = data[++i] - 0x80 & 0xFF;
} else {
if (index !== 0) {
index = 0;
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
results[results.length] = b & 0xFF;
}
}
if (index !== 0) {
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
return results;
}
exports.EUCJPToJIS = EUCJPToJIS;
/**
* EUCJP to SJIS
*/
function EUCJPToSJIS(data) {
var results = [];
var len = data && data.length;
var i = 0;
var b1, b2;
for (; i < len; i++) {
b1 = data[i];
if (b1 === 0x8F) {
results[results.length] = config.FALLBACK_CHARACTER;
i += 2;
} else if (b1 > 0x8E) {
b2 = data[++i];
if (b1 & 0x01) {
b1 >>= 1;
if (b1 < 0x6F) {
b1 += 0x31;
} else {
b1 += 0x71;
}
if (b2 > 0xDF) {
b2 -= 0x60;
} else {
b2 -= 0x61;
}
} else {
b1 >>= 1;
if (b1 <= 0x6F) {
b1 += 0x30;
} else {
b1 += 0x70;
}
b2 -= 0x02;
}
results[results.length] = b1 & 0xFF;
results[results.length] = b2 & 0xFF;
} else if (b1 === 0x8E) {
results[results.length] = data[++i] & 0xFF;
} else {
results[results.length] = b1 & 0xFF;
}
}
return results;
}
exports.EUCJPToSJIS = EUCJPToSJIS;
/**
* SJIS To UTF-8
*/
function SJISToUTF8(data) {
config.init_JIS_TO_UTF8_TABLE();
var results = [];
var i = 0;
var len = data && data.length;
var b, b1, b2, u2, u3, jis, utf8;
for (; i < len; i++) {
b = data[i];
if (b >= 0xA1 && b <= 0xDF) {
b2 = b - 0x40;
u2 = 0xBC | ((b2 >> 6) & 0x03);
u3 = 0x80 | (b2 & 0x3F);
results[results.length] = 0xEF;
results[results.length] = u2 & 0xFF;
results[results.length] = u3 & 0xFF;
} else if (b >= 0x80) {
b1 = b << 1;
b2 = data[++i];
if (b2 < 0x9F) {
if (b1 < 0x13F) {
b1 -= 0xE1;
} else {
b1 -= 0x61;
}
if (b2 > 0x7E) {
b2 -= 0x20;
} else {
b2 -= 0x1F;
}
} else {
if (b1 < 0x13F) {
b1 -= 0xE0;
} else {
b1 -= 0x60;
}
b2 -= 0x7E;
}
b1 &= 0xFF;
jis = (b1 << 8) + b2;
utf8 = EncodingTable.JIS_TO_UTF8_TABLE[jis];
if (utf8 === void 0) {
results[results.length] = config.FALLBACK_CHARACTER;
} else {
if (utf8 < 0xFFFF) {
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
} else {
results[results.length] = utf8 >> 16 & 0xFF;
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
}
}
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.SJISToUTF8 = SJISToUTF8;
/**
* EUC-JP to UTF-8
*/
function EUCJPToUTF8(data) {
config.init_JIS_TO_UTF8_TABLE();
var results = [];
var i = 0;
var len = data && data.length;
var b, b2, u2, u3, j2, j3, jis, utf8;
for (; i < len; i++) {
b = data[i];
if (b === 0x8E) {
b2 = data[++i] - 0x40;
u2 = 0xBC | ((b2 >> 6) & 0x03);
u3 = 0x80 | (b2 & 0x3F);
results[results.length] = 0xEF;
results[results.length] = u2 & 0xFF;
results[results.length] = u3 & 0xFF;
} else if (b === 0x8F) {
j2 = data[++i] - 0x80;
j3 = data[++i] - 0x80;
jis = (j2 << 8) + j3;
utf8 = EncodingTable.JISX0212_TO_UTF8_TABLE[jis];
if (utf8 === void 0) {
results[results.length] = config.FALLBACK_CHARACTER;
} else {
if (utf8 < 0xFFFF) {
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
} else {
results[results.length] = utf8 >> 16 & 0xFF;
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
}
}
} else if (b >= 0x80) {
jis = ((b - 0x80) << 8) + (data[++i] - 0x80);
utf8 = EncodingTable.JIS_TO_UTF8_TABLE[jis];
if (utf8 === void 0) {
results[results.length] = config.FALLBACK_CHARACTER;
} else {
if (utf8 < 0xFFFF) {
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
} else {
results[results.length] = utf8 >> 16 & 0xFF;
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
}
}
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.EUCJPToUTF8 = EUCJPToUTF8;
/**
* JIS to UTF-8
*/
function JISToUTF8(data) {
config.init_JIS_TO_UTF8_TABLE();
var results = [];
var index = 0;
var i = 0;
var len = data && data.length;
var b2, u2, u3, jis, utf8;
for (; i < len; i++) {
while (data[i] === 0x1B) {
if ((data[i + 1] === 0x24 && data[i + 2] === 0x42) ||
(data[i + 1] === 0x24 && data[i + 2] === 0x40)) {
index = 1;
} else if (data[i + 1] === 0x28 && data[i + 2] === 0x49) {
index = 2;
} else if (data[i + 1] === 0x24 && data[i + 2] === 0x28 &&
data[i + 3] === 0x44) {
index = 3;
i++;
} else {
index = 0;
}
i += 3;
if (data[i] === void 0) {
return results;
}
}
if (index === 1) {
jis = (data[i] << 8) + data[++i];
utf8 = EncodingTable.JIS_TO_UTF8_TABLE[jis];
if (utf8 === void 0) {
results[results.length] = config.FALLBACK_CHARACTER;
} else {
if (utf8 < 0xFFFF) {
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
} else {
results[results.length] = utf8 >> 16 & 0xFF;
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
}
}
} else if (index === 2) {
b2 = data[i] + 0x40;
u2 = 0xBC | ((b2 >> 6) & 0x03);
u3 = 0x80 | (b2 & 0x3F);
results[results.length] = 0xEF;
results[results.length] = u2 & 0xFF;
results[results.length] = u3 & 0xFF;
} else if (index === 3) {
jis = (data[i] << 8) + data[++i];
utf8 = EncodingTable.JISX0212_TO_UTF8_TABLE[jis];
if (utf8 === void 0) {
results[results.length] = config.FALLBACK_CHARACTER;
} else {
if (utf8 < 0xFFFF) {
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
} else {
results[results.length] = utf8 >> 16 & 0xFF;
results[results.length] = utf8 >> 8 & 0xFF;
results[results.length] = utf8 & 0xFF;
}
}
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.JISToUTF8 = JISToUTF8;
/**
* UTF-8 to SJIS
*/
function UTF8ToSJIS(data, options) {
var results = [];
var i = 0;
var len = data && data.length;
var b, b1, b2, bytes, utf8, jis;
var fallbackOption = options && options.fallback;
for (; i < len; i++) {
b = data[i];
if (b >= 0x80) {
if (b <= 0xDF) {
// 2 bytes
bytes = [b, data[i + 1]];
utf8 = (b << 8) + data[++i];
} else if (b <= 0xEF) {
// 3 bytes
bytes = [b, data[i + 1], data[i + 2]];
utf8 = (b << 16) +
(data[++i] << 8) +
(data[++i] & 0xFF);
} else {
// 4 bytes
bytes = [b, data[i + 1], data[i + 2], data[i + 3]];
utf8 = (b << 24) +
(data[++i] << 16) +
(data[++i] << 8) +
(data[++i] & 0xFF);
}
jis = EncodingTable.UTF8_TO_JIS_TABLE[utf8];
if (jis == null) {
if (fallbackOption) {
handleFallback(results, bytes, fallbackOption);
} else {
results[results.length] = config.FALLBACK_CHARACTER;
}
} else {
if (jis < 0xFF) {
results[results.length] = jis + 0x80;
} else {
if (jis > 0x10000) {
jis -= 0x10000;
}
b1 = jis >> 8;
b2 = jis & 0xFF;
if (b1 & 0x01) {
b1 >>= 1;
if (b1 < 0x2F) {
b1 += 0x71;
} else {
b1 -= 0x4F;
}
if (b2 > 0x5F) {
b2 += 0x20;
} else {
b2 += 0x1F;
}
} else {
b1 >>= 1;
if (b1 <= 0x2F) {
b1 += 0x70;
} else {
b1 -= 0x50;
}
b2 += 0x7E;
}
results[results.length] = b1 & 0xFF;
results[results.length] = b2 & 0xFF;
}
}
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.UTF8ToSJIS = UTF8ToSJIS;
/**
* UTF-8 to EUC-JP
*/
function UTF8ToEUCJP(data, options) {
var results = [];
var i = 0;
var len = data && data.length;
var b, bytes, utf8, jis;
var fallbackOption = options && options.fallback;
for (; i < len; i++) {
b = data[i];
if (b >= 0x80) {
if (b <= 0xDF) {
// 2 bytes
bytes = [b, data[i + 1]];
utf8 = (b << 8) + data[++i];
} else if (b <= 0xEF) {
// 3 bytes
bytes = [b, data[i + 1], data[i + 2]];
utf8 = (b << 16) +
(data[++i] << 8) +
(data[++i] & 0xFF);
} else {
// 4 bytes
bytes = [b, data[i + 1], data[i + 2], data[i + 3]];
utf8 = (b << 24) +
(data[++i] << 16) +
(data[++i] << 8) +
(data[++i] & 0xFF);
}
jis = EncodingTable.UTF8_TO_JIS_TABLE[utf8];
if (jis == null) {
jis = EncodingTable.UTF8_TO_JISX0212_TABLE[utf8];
if (jis == null) {
if (fallbackOption) {
handleFallback(results, bytes, fallbackOption);
} else {
results[results.length] = config.FALLBACK_CHARACTER;
}
} else {
results[results.length] = 0x8F;
results[results.length] = (jis >> 8) - 0x80 & 0xFF;
results[results.length] = (jis & 0xFF) - 0x80 & 0xFF;
}
} else {
if (jis > 0x10000) {
jis -= 0x10000;
}
if (jis < 0xFF) {
results[results.length] = 0x8E;
results[results.length] = jis - 0x80 & 0xFF;
} else {
results[results.length] = (jis >> 8) - 0x80 & 0xFF;
results[results.length] = (jis & 0xFF) - 0x80 & 0xFF;
}
}
} else {
results[results.length] = data[i] & 0xFF;
}
}
return results;
}
exports.UTF8ToEUCJP = UTF8ToEUCJP;
/**
* UTF-8 to JIS
*/
function UTF8ToJIS(data, options) {
var results = [];
var index = 0;
var len = data && data.length;
var i = 0;
var b, bytes, utf8, jis;
var fallbackOption = options && options.fallback;
var esc = [
0x1B, 0x28, 0x42,
0x1B, 0x24, 0x42,
0x1B, 0x28, 0x49,
0x1B, 0x24, 0x28, 0x44
];
for (; i < len; i++) {
b = data[i];
if (b < 0x80) {
if (index !== 0) {
index = 0;
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
results[results.length] = b & 0xFF;
} else {
if (b <= 0xDF) {
// 2 bytes
bytes = [b, data[i + 1]];
utf8 = (b << 8) + data[++i];
} else if (b <= 0xEF) {
// 3 bytes
bytes = [b, data[i + 1], data[i + 2]];
utf8 = (b << 16) +
(data[++i] << 8) +
(data[++i] & 0xFF);
} else {
// 4 bytes
bytes = [b, data[i + 1], data[i + 2], data[i + 3]];
utf8 = (b << 24) +
(data[++i] << 16) +
(data[++i] << 8) +
(data[++i] & 0xFF);
}
jis = EncodingTable.UTF8_TO_JIS_TABLE[utf8];
if (jis == null) {
jis = EncodingTable.UTF8_TO_JISX0212_TABLE[utf8];
if (jis == null) {
if (index !== 0) {
index = 0;
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
if (fallbackOption) {
handleFallback(results, bytes, fallbackOption);
} else {
results[results.length] = config.FALLBACK_CHARACTER;
}
} else {
// JIS X 0212:1990
if (index !== 3) {
index = 3;
results[results.length] = esc[9];
results[results.length] = esc[10];
results[results.length] = esc[11];
results[results.length] = esc[12];
}
results[results.length] = jis >> 8 & 0xFF;
results[results.length] = jis & 0xFF;
}
} else {
if (jis > 0x10000) {
jis -= 0x10000;
}
if (jis < 0xFF) {
// Halfwidth Katakana
if (index !== 2) {
index = 2;
results[results.length] = esc[6];
results[results.length] = esc[7];
results[results.length] = esc[8];
}
results[results.length] = jis & 0xFF;
} else {
if (index !== 1) {
index = 1;
results[results.length] = esc[3];
results[results.length] = esc[4];
results[results.length] = esc[5];
}
results[results.length] = jis >> 8 & 0xFF;
results[results.length] = jis & 0xFF;
}
}
}
}
if (index !== 0) {
results[results.length] = esc[0];
results[results.length] = esc[1];
results[results.length] = esc[2];
}
return results;
}
exports.UTF8ToJIS = UTF8ToJIS;
/**
* UTF-16 (JavaScript Unicode array) to UTF-8
*/
function UNICODEToUTF8(data) {
var results = [];
var i = 0;
var len = data && data.length;
var c, second;
for (; i < len; i++) {
c = data[i];
// high surrogate
if (c >= 0xD800 && c <= 0xDBFF && i + 1 < len) {
second = data[i + 1];
// low surrogate
if (second >= 0xDC00 && second <= 0xDFFF) {
c = (c - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
i++;
}
}
if (c < 0x80) {
results[results.length] = c;
} else if (c < 0x800) {
results[results.length] = 0xC0 | ((c >> 6) & 0x1F);
results[results.length] = 0x80 | (c & 0x3F);
} else if (c < 0x10000) {
results[results.length] = 0xE0 | ((c >> 12) & 0xF);
results[results.length] = 0x80 | ((c >> 6) & 0x3F);
results[results.length] = 0x80 | (c & 0x3F);
} else if (c < 0x200000) {
results[results.length] = 0xF0 | ((c >> 18) & 0xF);
results[results.length] = 0x80 | ((c >> 12) & 0x3F);
results[results.length] = 0x80 | ((c >> 6) & 0x3F);
results[results.length] = 0x80 | (c & 0x3F);
}
}
return results;
}
exports.UNICODEToUTF8 = UNICODEToUTF8;
/**
* UTF-8 to UTF-16 (JavaScript Unicode array)
*/
function UTF8ToUNICODE(data, options) {
var results = [];
var i = 0;
var len = data && data.length;
var n, c, c2, c3, c4, code;
// For internal usage only
var ignoreSurrogatePair = options && options.ignoreSurrogatePair;
while (i < len) {
c = data[i++];
n = c >> 4;
if (n >= 0 && n <= 7) {
// 0xxx xxxx
code = c;
} else if (n === 12 || n === 13) {
// 110x xxxx
// 10xx xxxx
c2 = data[i++];
code = ((c & 0x1F) << 6) | (c2 & 0x3F);
} else if (n === 14) {
// 1110 xxxx
// 10xx xxxx
// 10xx xxxx
c2 = data[i++];
c3 = data[i++];
code = ((c & 0x0F) << 12) |
((c2 & 0x3F) << 6) |
(c3 & 0x3F);
} else if (n === 15) {
// 1111 0xxx
// 10xx xxxx
// 10xx xxxx
// 10xx xxxx
c2 = data[i++];
c3 = data[i++];
c4 = data[i++];
code = ((c & 0x7) << 18) |
((c2 & 0x3F) << 12) |
((c3 & 0x3F) << 6) |
(c4 & 0x3F);
}
if (code <= 0xFFFF || ignoreSurrogatePair) {
results[results.length] = code;
} else {
// Split in surrogate halves
code -= 0x10000;
results[results.length] = (code >> 10) + 0xD800; // High surrogate
results[results.length] = (code % 0x400) + 0xDC00; // Low surrogate
}
}
return results;
}
exports.UTF8ToUNICODE = UTF8ToUNICODE;
/**
* UTF-16 (JavaScript Unicode array) to UTF-16
*
* UTF-16BE (big-endian)
* Note: this function does not prepend the BOM by default.
*
* RFC 2781 4.3 Interpreting text labelled as UTF-16
* If the first two octets of the text is not 0xFE followed by
* 0xFF, and is not 0xFF followed by 0xFE, then the text SHOULD be
* interpreted as being big-endian.
*
* @link https://www.ietf.org/rfc/rfc2781.txt
* UTF-16, an encoding of ISO 10646
*/
function UNICODEToUTF16(data, options) {
var results;
if (options && options.bom) {
var optBom = options.bom;
if (!util.isString(optBom)) {
optBom = 'BE';
}
var bom, utf16;
if (optBom.charAt(0).toUpperCase() === 'B') {
// Big-endian
bom = [0xFE, 0xFF];
utf16 = UNICODEToUTF16BE(data);
} else {
// Little-endian
bom = [0xFF, 0xFE];
utf16 = UNICODEToUTF16LE(data);
}
results = [];
results[0] = bom[0];
results[1] = bom[1];
for (var i = 0, len = utf16.length; i < len; i++) {
results[results.length] = utf16[i];
}
} else {
// Should be interpreted as being big-endian when text has no BOM
results = UNICODEToUTF16BE(data);
}
return results;
}
exports.UNICODEToUTF16 = UNICODEToUTF16;
/**
* UTF-16 (JavaScript Unicode array) to UTF-16BE
*
* @link https://www.ietf.org/rfc/rfc2781.txt
* UTF-16, an encoding of ISO 10646
*/
function UNICODEToUTF16BE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var c;
while (i < len) {
c = data[i++];
if (c <= 0xFF) {
results[results.length] = 0;
results[results.length] = c;
} else if (c <= 0xFFFF) {
results[results.length] = c >> 8 & 0xFF;
results[results.length] = c & 0xFF;
}
}
return results;
}
exports.UNICODEToUTF16BE = UNICODEToUTF16BE;
/**
* UTF-16 (JavaScript Unicode array) to UTF-16LE
*
* @link https://www.ietf.org/rfc/rfc2781.txt
* UTF-16, an encoding of ISO 10646
*/
function UNICODEToUTF16LE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var c;
while (i < len) {
c = data[i++];
if (c <= 0xFF) {
results[results.length] = c;
results[results.length] = 0;
} else if (c <= 0xFFFF) {
results[results.length] = c & 0xFF;
results[results.length] = c >> 8 & 0xFF;
}
}
return results;
}
exports.UNICODEToUTF16LE = UNICODEToUTF16LE;
/**
* UTF-16BE to UTF-16 (JavaScript Unicode array)
*
* @link https://www.ietf.org/rfc/rfc2781.txt
* UTF-16, an encoding of ISO 10646
*/
function UTF16BEToUNICODE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var c1, c2;
if (len >= 2 &&
((data[0] === 0xFE && data[1] === 0xFF) ||
(data[0] === 0xFF && data[1] === 0xFE))
) {
i = 2;
}
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (c1 === 0) {
results[results.length] = c2;
} else {
results[results.length] = ((c1 & 0xFF) << 8) | (c2 & 0xFF);
}
}
return results;
}
exports.UTF16BEToUNICODE = UTF16BEToUNICODE;
/**
* UTF-16LE to UTF-16 (JavaScript Unicode array)
*
* @link https://www.ietf.org/rfc/rfc2781.txt
* UTF-16, an encoding of ISO 10646
*/
function UTF16LEToUNICODE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var c1, c2;
if (len >= 2 &&
((data[0] === 0xFE && data[1] === 0xFF) ||
(data[0] === 0xFF && data[1] === 0xFE))
) {
i = 2;
}
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (c2 === 0) {
results[results.length] = c1;
} else {
results[results.length] = ((c2 & 0xFF) << 8) | (c1 & 0xFF);
}
}
return results;
}
exports.UTF16LEToUNICODE = UTF16LEToUNICODE;
/**
* UTF-16 to UTF-16 (JavaScript Unicode array)
*
* @link https://www.ietf.org/rfc/rfc2781.txt
* UTF-16, an encoding of ISO 10646
*/
function UTF16ToUNICODE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var isLE = false;
var first = true;
var c1, c2;
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (first && i === 2) {
first = false;
if (c1 === 0xFE && c2 === 0xFF) {
isLE = false;
} else if (c1 === 0xFF && c2 === 0xFE) {
// Little-endian
isLE = true;
} else {
isLE = EncodingDetect.isUTF16LE(data);
i = 0;
}
continue;
}
if (isLE) {
if (c2 === 0) {
results[results.length] = c1;
} else {
results[results.length] = ((c2 & 0xFF) << 8) | (c1 & 0xFF);
}
} else {
if (c1 === 0) {
results[results.length] = c2;
} else {
results[results.length] = ((c1 & 0xFF) << 8) | (c2 & 0xFF);
}
}
}
return results;
}
exports.UTF16ToUNICODE = UTF16ToUNICODE;
/**
* UTF-16 to UTF-16BE
*/
function UTF16ToUTF16BE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var isLE = false;
var first = true;
var c1, c2;
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (first && i === 2) {
first = false;
if (c1 === 0xFE && c2 === 0xFF) {
isLE = false;
} else if (c1 === 0xFF && c2 === 0xFE) {
// Little-endian
isLE = true;
} else {
isLE = EncodingDetect.isUTF16LE(data);
i = 0;
}
continue;
}
if (isLE) {
results[results.length] = c2;
results[results.length] = c1;
} else {
results[results.length] = c1;
results[results.length] = c2;
}
}
return results;
}
exports.UTF16ToUTF16BE = UTF16ToUTF16BE;
/**
* UTF-16BE to UTF-16
*/
function UTF16BEToUTF16(data, options) {
var isLE = false;
var bom;
if (options && options.bom) {
var optBom = options.bom;
if (!util.isString(optBom)) {
optBom = 'BE';
}
if (optBom.charAt(0).toUpperCase() === 'B') {
// Big-endian
bom = [0xFE, 0xFF];
} else {
// Little-endian
bom = [0xFF, 0xFE];
isLE = true;
}
}
var results = [];
var len = data && data.length;
var i = 0;
if (len >= 2 &&
((data[0] === 0xFE && data[1] === 0xFF) ||
(data[0] === 0xFF && data[1] === 0xFE))
) {
i = 2;
}
if (bom) {
results[0] = bom[0];
results[1] = bom[1];
}
var c1, c2;
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (isLE) {
results[results.length] = c2;
results[results.length] = c1;
} else {
results[results.length] = c1;
results[results.length] = c2;
}
}
return results;
}
exports.UTF16BEToUTF16 = UTF16BEToUTF16;
/**
* UTF-16 to UTF-16LE
*/
function UTF16ToUTF16LE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var isLE = false;
var first = true;
var c1, c2;
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (first && i === 2) {
first = false;
if (c1 === 0xFE && c2 === 0xFF) {
isLE = false;
} else if (c1 === 0xFF && c2 === 0xFE) {
// Little-endian
isLE = true;
} else {
isLE = EncodingDetect.isUTF16LE(data);
i = 0;
}
continue;
}
if (isLE) {
results[results.length] = c1;
results[results.length] = c2;
} else {
results[results.length] = c2;
results[results.length] = c1;
}
}
return results;
}
exports.UTF16ToUTF16LE = UTF16ToUTF16LE;
/**
* UTF-16LE to UTF-16
*/
function UTF16LEToUTF16(data, options) {
var isLE = false;
var bom;
if (options && options.bom) {
var optBom = options.bom;
if (!util.isString(optBom)) {
optBom = 'BE';
}
if (optBom.charAt(0).toUpperCase() === 'B') {
// Big-endian
bom = [0xFE, 0xFF];
} else {
// Little-endian
bom = [0xFF, 0xFE];
isLE = true;
}
}
var results = [];
var len = data && data.length;
var i = 0;
if (len >= 2 &&
((data[0] === 0xFE && data[1] === 0xFF) ||
(data[0] === 0xFF && data[1] === 0xFE))
) {
i = 2;
}
if (bom) {
results[0] = bom[0];
results[1] = bom[1];
}
var c1, c2;
while (i < len) {
c1 = data[i++];
c2 = data[i++];
if (isLE) {
results[results.length] = c1;
results[results.length] = c2;
} else {
results[results.length] = c2;
results[results.length] = c1;
}
}
return results;
}
exports.UTF16LEToUTF16 = UTF16LEToUTF16;
/**
* UTF-16BE to UTF-16LE
*/
function UTF16BEToUTF16LE(data) {
var results = [];
var i = 0;
var len = data && data.length;
var c1, c2;
if (len >= 2 &&
((data[0] === 0xFE && data[1] === 0xFF) ||
(data[0] === 0xFF && data[1] === 0xFE))
) {
i = 2;
}
while (i < len) {
c1 = data[i++];
c2 = data[i++];
results[results.length] = c2;
results[results.length] = c1;
}
return results;
}
exports.UTF16BEToUTF16LE = UTF16BEToUTF16LE;
/**
* UTF-16LE to UTF-16BE
*/
function UTF16LEToUTF16BE(data) {
return UTF16BEToUTF16LE(data);
}
exports.UTF16LEToUTF16BE = UTF16LEToUTF16BE;
/**
* UTF-16 (JavaScript Unicode array) to JIS
*/
function UNICODEToJIS(data, options) {
return UTF8ToJIS(UNICODEToUTF8(data), options);
}
exports.UNICODEToJIS = UNICODEToJIS;
/**
* JIS to UTF-16 (JavaScript Unicode array)
*/
function JISToUNICODE(data) {
return UTF8ToUNICODE(JISToUTF8(data));
}
exports.JISToUNICODE = JISToUNICODE;
/**
* UTF-16 (JavaScript Unicode array) to EUCJP
*/
function UNICODEToEUCJP(data, options) {
return UTF8ToEUCJP(UNICODEToUTF8(data), options);
}
exports.UNICODEToEUCJP = UNICODEToEUCJP;
/**
* EUCJP to UTF-16 (JavaScript Unicode array)
*/
function EUCJPToUNICODE(data) {
return UTF8ToUNICODE(EUCJPToUTF8(data));
}
exports.EUCJPToUNICODE = EUCJPToUNICODE;
/**
* UTF-16 (JavaScript Unicode array) to SJIS
*/
function UNICODEToSJIS(data, options) {
return UTF8ToSJIS(UNICODEToUTF8(data), options);
}
exports.UNICODEToSJIS = UNICODEToSJIS;
/**
* SJIS to UTF-16 (JavaScript Unicode array)
*/
function SJISToUNICODE(data) {
return UTF8ToUNICODE(SJISToUTF8(data));
}
exports.SJISToUNICODE = SJISToUNICODE;
/**
* UTF-8 to UTF-16
*/
function UTF8ToUTF16(data, options) {
return UNICODEToUTF16(UTF8ToUNICODE(data), options);
}
exports.UTF8ToUTF16 = UTF8ToUTF16;
/**
* UTF-16 to UTF-8
*/
function UTF16ToUTF8(data) {
return UNICODEToUTF8(UTF16ToUNICODE(data));
}
exports.UTF16ToUTF8 = UTF16ToUTF8;
/**
* UTF-8 to UTF-16BE
*/
function UTF8ToUTF16BE(data) {
return UNICODEToUTF16BE(UTF8ToUNICODE(data));
}
exports.UTF8ToUTF16BE = UTF8ToUTF16BE;
/**
* UTF-16BE to UTF-8
*/
function UTF16BEToUTF8(data) {
return UNICODEToUTF8(UTF16BEToUNICODE(data));
}
exports.UTF16BEToUTF8 = UTF16BEToUTF8;
/**
* UTF-8 to UTF-16LE
*/
function UTF8ToUTF16LE(data) {
return UNICODEToUTF16LE(UTF8ToUNICODE(data));
}
exports.UTF8ToUTF16LE = UTF8ToUTF16LE;
/**
* UTF-16LE to UTF-8
*/
function UTF16LEToUTF8(data) {
return UNICODEToUTF8(UTF16LEToUNICODE(data));
}
exports.UTF16LEToUTF8 = UTF16LEToUTF8;
/**
* JIS to UTF-16
*/
function JISToUTF16(data, options) {
return UTF8ToUTF16(JISToUTF8(data), options);
}
exports.JISToUTF16 = JISToUTF16;
/**
* UTF-16 to JIS
*/
function UTF16ToJIS(data, options) {
return UTF8ToJIS(UTF16ToUTF8(data), options);
}
exports.UTF16ToJIS = UTF16ToJIS;
/**
* JIS to UTF-16BE
*/
function JISToUTF16BE(data) {
return UTF8ToUTF16BE(JISToUTF8(data));
}
exports.JISToUTF16BE = JISToUTF16BE;
/**
* UTF-16BE to JIS
*/
function UTF16BEToJIS(data, options) {
return UTF8ToJIS(UTF16BEToUTF8(data), options);
}
exports.UTF16BEToJIS = UTF16BEToJIS;
/**
* JIS to UTF-16LE
*/
function JISToUTF16LE(data) {
return UTF8ToUTF16LE(JISToUTF8(data));
}
exports.JISToUTF16LE = JISToUTF16LE;
/**
* UTF-16LE to JIS
*/
function UTF16LEToJIS(data, options) {
return UTF8ToJIS(UTF16LEToUTF8(data), options);
}
exports.UTF16LEToJIS = UTF16LEToJIS;
/**
* EUC-JP to UTF-16
*/
function EUCJPToUTF16(data, options) {
return UTF8ToUTF16(EUCJPToUTF8(data), options);
}
exports.EUCJPToUTF16 = EUCJPToUTF16;
/**
* UTF-16 to EUC-JP
*/
function UTF16ToEUCJP(data, options) {
return UTF8ToEUCJP(UTF16ToUTF8(data), options);
}
exports.UTF16ToEUCJP = UTF16ToEUCJP;
/**
* EUC-JP to UTF-16BE
*/
function EUCJPToUTF16BE(data) {
return UTF8ToUTF16BE(EUCJPToUTF8(data));
}
exports.EUCJPToUTF16BE = EUCJPToUTF16BE;
/**
* UTF-16BE to EUC-JP
*/
function UTF16BEToEUCJP(data, options) {
return UTF8ToEUCJP(UTF16BEToUTF8(data), options);
}
exports.UTF16BEToEUCJP = UTF16BEToEUCJP;
/**
* EUC-JP to UTF-16LE
*/
function EUCJPToUTF16LE(data) {
return UTF8ToUTF16LE(EUCJPToUTF8(data));
}
exports.EUCJPToUTF16LE = EUCJPToUTF16LE;
/**
* UTF-16LE to EUC-JP
*/
function UTF16LEToEUCJP(data, options) {
return UTF8ToEUCJP(UTF16LEToUTF8(data), options);
}
exports.UTF16LEToEUCJP = UTF16LEToEUCJP;
/**
* SJIS to UTF-16
*/
function SJISToUTF16(data, options) {
return UTF8ToUTF16(SJISToUTF8(data), options);
}
exports.SJISToUTF16 = SJISToUTF16;
/**
* UTF-16 to SJIS
*/
function UTF16ToSJIS(data, options) {
return UTF8ToSJIS(UTF16ToUTF8(data), options);
}
exports.UTF16ToSJIS = UTF16ToSJIS;
/**
* SJIS to UTF-16BE
*/
function SJISToUTF16BE(data) {
return UTF8ToUTF16BE(SJISToUTF8(data));
}
exports.SJISToUTF16BE = SJISToUTF16BE;
/**
* UTF-16BE to SJIS
*/
function UTF16BEToSJIS(data, options) {
return UTF8ToSJIS(UTF16BEToUTF8(data), options);
}
exports.UTF16BEToSJIS = UTF16BEToSJIS;
/**
* SJIS to UTF-16LE
*/
function SJISToUTF16LE(data) {
return UTF8ToUTF16LE(SJISToUTF8(data));
}
exports.SJISToUTF16LE = SJISToUTF16LE;
/**
* UTF-16LE to SJIS
*/
function UTF16LEToSJIS(data, options) {
return UTF8ToSJIS(UTF16LEToUTF8(data), options);
}
exports.UTF16LEToSJIS = UTF16LEToSJIS;
/**
* Fallback handler when a character can't be represented
*/
function handleFallback(results, bytes, fallbackOption) {
switch (fallbackOption) {
case 'html-entity':
case 'html-entity-hex':
var unicode = UTF8ToUNICODE(bytes, { ignoreSurrogatePair: true })[0];
if (unicode) {
results[results.length] = 0x26; // &
results[results.length] = 0x23; // #
var radix = fallbackOption.slice(-3) === 'hex' ? 16 : 10;
if (radix === 16) {
results[results.length] = 0x78; // x
}
var entity = unicode.toString(radix);
for (var i = 0, len = entity.length; i < len; i++) {
results[results.length] = entity.charCodeAt(i);
}
results[results.length] = 0x3B; // ;
}
break;
case 'error':
throw new Error('Character cannot be represented: [' + bytes.join(', ') + ']');
case 'ignore':
break;
}
}
},{"./config":2,"./encoding-detect":4,"./encoding-table":5,"./util":12}],4:[function(require,module,exports){
/**
* Binary (exe, images and so, etc.)
*
* Note:
* This function is not considered for Unicode
*/
function isBINARY(data) {
var i = 0;
var len = data && data.length;
var c;
for (; i < len; i++) {
c = data[i];
if (c > 0xFF) {
return false;
}
if ((c >= 0x00 && c <= 0x07) || c === 0xFF) {
return true;
}
}
return false;
}
exports.isBINARY = isBINARY;
/**
* ASCII (ISO-646)
*/
function isASCII(data) {
var i = 0;
var len = data && data.length;
var b;
for (; i < len; i++) {
b = data[i];
if (b > 0xFF ||
(b >= 0x80 && b <= 0xFF) ||
b === 0x1B) {
return false;
}
}
return true;
}
exports.isASCII = isASCII;
/**
* ISO-2022-JP (JIS)
*
* RFC1468 Japanese Character Encoding for Internet Messages
* RFC1554 ISO-2022-JP-2: Multilingual Extension of ISO-2022-JP
* RFC2237 Japanese Character Encoding for Internet Messages
*/
function isJIS(data) {
var i = 0;
var len = data && data.length;
var b, esc1, esc2;
for (; i < len; i++) {
b = data[i];
if (b > 0xFF || (b >= 0x80 && b <= 0xFF)) {
return false;
}
if (b === 0x1B) {
if (i + 2 >= len) {
return false;
}
esc1 = data[i + 1];
esc2 = data[i + 2];
if (esc1 === 0x24) {
if (esc2 === 0x28 || // JIS X 0208-1990/2000/2004
esc2 === 0x40 || // JIS X 0208-1978
esc2 === 0x42) { // JIS X 0208-1983
return true;
}
} else if (esc1 === 0x26 && // JIS X 0208-1990
esc2 === 0x40) {
return true;
} else if (esc1 === 0x28) {
if (esc2 === 0x42 || // ASCII
esc2 === 0x49 || // JIS X 0201 Halfwidth Katakana
esc2 === 0x4A) { // JIS X 0201-1976 Roman set
return true;
}
}
}
}
return false;
}
exports.isJIS = isJIS;
/**
* EUC-JP
*/
function isEUCJP(data) {
var i = 0;
var len = data && data.length;
var b;
for (; i < len; i++) {
b = data[i];
if (b < 0x80) {
continue;
}
if (b > 0xFF || b < 0x8E) {
return false;
}
if (b === 0x8E) {
if (i + 1 >= len) {
return false;
}
b = data[++i];
if (b < 0xA1 || 0xDF < b) {
return false;
}
} else if (b === 0x8F) {
if (i + 2 >= len) {
return false;
}
b = data[++i];
if (b < 0xA2 || 0xED < b) {
return false;
}
b = data[++i];
if (b < 0xA1 || 0xFE < b) {
return false;
}
} else if (0xA1 <= b && b <= 0xFE) {
if (i + 1 >= len) {
return false;
}
b = data[++i];
if (b < 0xA1 || 0xFE < b) {
return false;
}
} else {
return false;
}
}
return true;
}
exports.isEUCJP = isEUCJP;
/**
* Shift-JIS (SJIS)
*/
function isSJIS(data) {
var i = 0;
var len = data && data.length;
var b;
while (i < len && data[i] > 0x80) {
if (data[i++] > 0xFF) {
return false;
}
}
for (; i < len; i++) {
b = data[i];
if (b <= 0x80 ||
(0xA1 <= b && b <= 0xDF)) {
continue;
}
if (b === 0xA0 || b > 0xEF || i + 1 >= len) {
return false;
}
b = data[++i];
if (b < 0x40 || b === 0x7F || b > 0xFC) {
return false;
}
}
return true;
}
exports.isSJIS = isSJIS;
/**
* UTF-8
*/
function isUTF8(data) {
var i = 0;
var len = data && data.length;
var b;
for (; i < len; i++) {
b = data[i];
if (b > 0xFF) {
return false;
}
if (b === 0x09 || b === 0x0A || b === 0x0D ||
(b >= 0x20 && b <= 0x7E)) {
continue;
}
if (b >= 0xC2 && b <= 0xDF) {
if (i + 1 >= len || data[i + 1] < 0x80 || data[i + 1] > 0xBF) {
return false;
}
i++;
} else if (b === 0xE0) {
if (i + 2 >= len ||
data[i + 1] < 0xA0 || data[i + 1] > 0xBF ||
data[i + 2] < 0x80 || data[i + 2] > 0xBF) {
return false;
}
i += 2;
} else if ((b >= 0xE1 && b <= 0xEC) ||
b === 0xEE || b === 0xEF) {
if (i + 2 >= len ||
data[i + 1] < 0x80 || data[i + 1] > 0xBF ||
data[i + 2] < 0x80 || data[i + 2] > 0xBF) {
return false;
}
i += 2;
} else if (b === 0xED) {
if (i + 2 >= len ||
data[i + 1] < 0x80 || data[i + 1] > 0x9F ||
data[i + 2] < 0x80 || data[i + 2] > 0xBF) {
return false;
}
i += 2;
} else if (b === 0xF0) {
if (i + 3 >= len ||
data[i + 1] < 0x90 || data[i + 1] > 0xBF ||
data[i + 2] < 0x80 || data[i + 2] > 0xBF ||
data[i + 3] < 0x80 || data[i + 3] > 0xBF) {
return false;
}
i += 3;
} else if (b >= 0xF1 && b <= 0xF3) {
if (i + 3 >= len ||
data[i + 1] < 0x80 || data[i + 1] > 0xBF ||
data[i + 2] < 0x80 || data[i + 2] > 0xBF ||
data[i + 3] < 0x80 || data[i + 3] > 0xBF) {
return false;
}
i += 3;
} else if (b === 0xF4) {
if (i + 3 >= len ||
data[i + 1] < 0x80 || data[i + 1] > 0x8F ||
data[i + 2] < 0x80 || data[i + 2] > 0xBF ||
data[i + 3] < 0x80 || data[i + 3] > 0xBF) {
return false;
}
i += 3;
} else {
return false;
}
}
return true;
}
exports.isUTF8 = isUTF8;
/**
* UTF-16 (LE or BE)
*
* RFC2781: UTF-16, an encoding of ISO 10646
*
* @link http://www.ietf.org/rfc/rfc2781.txt
*/
function isUTF16(data) {
var i = 0;
var len = data && data.length;
var pos = null;
var b1, b2, next, prev;
if (len < 2) {
if (data[0] > 0xFF) {
return false;
}
} else {
b1 = data[0];
b2 = data[1];
if (b1 === 0xFF && // BOM (little-endian)
b2 === 0xFE) {
return true;
}
if (b1 === 0xFE && // BOM (big-endian)
b2 === 0xFF) {
return true;
}
for (; i < len; i++) {
if (data[i] === 0x00) {
pos = i;
break;
} else if (data[i] > 0xFF) {
return false;
}
}
if (pos === null) {
return false; // Non ASCII
}
next = data[pos + 1]; // BE
if (next !== void 0 && next > 0x00 && next < 0x80) {
return true;
}
prev = data[pos - 1]; // LE
if (prev !== void 0 && prev > 0x00 && prev < 0x80) {
return true;
}
}
return false;
}
exports.isUTF16 = isUTF16;
/**
* UTF-16BE (big-endian)
*
* RFC 2781 4.3 Interpreting text labelled as UTF-16
* Text labelled "UTF-16BE" can always be interpreted as being big-endian
* when BOM does not founds (SHOULD)
*
* @link http://www.ietf.org/rfc/rfc2781.txt
*/
function isUTF16BE(data) {
var i = 0;
var len = data && data.length;
var pos = null;
var b1, b2;
if (len < 2) {
if (data[0] > 0xFF) {
return false;
}
} else {
b1 = data[0];
b2 = data[1];
if (b1 === 0xFE && // BOM
b2 === 0xFF) {
return true;
}
for (; i < len; i++) {
if (data[i] === 0x00) {
pos = i;
break;
} else if (data[i] > 0xFF) {
return false;
}
}
if (pos === null) {
return false; // Non ASCII
}
if (pos % 2 === 0) {
return true;
}
}
return false;
}
exports.isUTF16BE = isUTF16BE;
/**
* UTF-16LE (little-endian)
*/
function isUTF16LE(data) {
var i = 0;
var len = data && data.length;
var pos = null;