This repository has been archived by the owner on Jul 10, 2019. It is now read-only.
forked from andris9/encoding
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
107 lines (96 loc) · 2.86 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
var Iconv, iconvLite = require("iconv-lite");
try{
Iconv = require("iconv").Iconv;
}catch(E){}
// 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
* @param {Boolean} useLite If set to ture, force to use iconvLite
* @return {Buffer} Encoded string
*/
function convert(str, to, from, useLite){
from = checkEncoding(from || "UTF-8");
to = checkEncoding(to || "UTF-8");
str = str || "";
var result;
if(from != "UTF-8" && typeof str == "string"){
str = new Buffer(str, "binary");
}
if(from == to){
result = str;
}else{
if(Iconv && !useLite){
try{
result = convertIconv(str, to, from);
}catch(E){
try{
result = convertIconvLite(str, to, from);
}catch(E){
result = str;
}
}
}else{
try{
result = convertIconvLite(str, to, from);
}catch(E){
result = str;
}
}
}
if(typeof result == "string"){
result = new Buffer(result, "utf-8");
}
return result;
}
/**
* Convert encoding of astring with node-iconv (if available)
*
* @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 convertIconv(str, to, from){
var response, iconv;
iconv = new Iconv(from, to + "//TRANSLIT//IGNORE");
response = iconv.convert(str);
return response.slice(0, response.length);
}
/**
* Convert encoding of astring with iconv-lite (if node-iconv is not available)
*
* @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){
name = (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();
return name;
}