84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var iconvLite = require('iconv-lite');
|
||
|
|
||
|
// Expose to the world
|
||
|
module.exports.convert = convert;
|
||
|
|
||
|
/**
|
||
|
* Convert encoding of an UTF-8 string or a buffer
|
||
|
*
|
||
|
* @param {String|Buffer} str String to be converted
|
||
|
* @param {String} to Encoding to be converted to
|
||
|
* @param {String} [from='UTF-8'] Encoding to be converted from
|
||
|
* @return {Buffer} Encoded string
|
||
|
*/
|
||
|
function convert(str, to, from) {
|
||
|
from = checkEncoding(from || 'UTF-8');
|
||
|
to = checkEncoding(to || 'UTF-8');
|
||
|
str = str || '';
|
||
|
|
||
|
var result;
|
||
|
|
||
|
if (from !== 'UTF-8' && typeof str === 'string') {
|
||
|
str = Buffer.from(str, 'binary');
|
||
|
}
|
||
|
|
||
|
if (from === to) {
|
||
|
if (typeof str === 'string') {
|
||
|
result = Buffer.from(str);
|
||
|
} else {
|
||
|
result = str;
|
||
|
}
|
||
|
} else {
|
||
|
try {
|
||
|
result = convertIconvLite(str, to, from);
|
||
|
} catch (E) {
|
||
|
console.error(E);
|
||
|
result = str;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeof result === 'string') {
|
||
|
result = Buffer.from(result, 'utf-8');
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert encoding of astring with iconv-lite
|
||
|
*
|
||
|
* @param {String|Buffer} str String to be converted
|
||
|
* @param {String} to Encoding to be converted to
|
||
|
* @param {String} [from='UTF-8'] Encoding to be converted from
|
||
|
* @return {Buffer} Encoded string
|
||
|
*/
|
||
|
function convertIconvLite(str, to, from) {
|
||
|
if (to === 'UTF-8') {
|
||
|
return iconvLite.decode(str, from);
|
||
|
} else if (from === 'UTF-8') {
|
||
|
return iconvLite.encode(str, to);
|
||
|
} else {
|
||
|
return iconvLite.encode(iconvLite.decode(str, from), to);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts charset name if needed
|
||
|
*
|
||
|
* @param {String} name Character set
|
||
|
* @return {String} Character set name
|
||
|
*/
|
||
|
function checkEncoding(name) {
|
||
|
return (name || '')
|
||
|
.toString()
|
||
|
.trim()
|
||
|
.replace(/^latin[\-_]?(\d+)$/i, 'ISO-8859-$1')
|
||
|
.replace(/^win(?:dows)?[\-_]?(\d+)$/i, 'WINDOWS-$1')
|
||
|
.replace(/^utf[\-_]?(\d+)$/i, 'UTF-$1')
|
||
|
.replace(/^ks_c_5601\-1987$/i, 'CP949')
|
||
|
.replace(/^us[\-_]?ascii$/i, 'ASCII')
|
||
|
.toUpperCase();
|
||
|
}
|