1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- '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();
- }
|