Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / j2s / java / lang / Encoding.js
1 Encoding = new Object();
2 Encoding.UTF8 = "utf-8";
3 Encoding.UTF16 = "utf-16";
4 Encoding.ASCII = "ascii";
5
6 /* protected */
7 Encoding.guessEncoding = function (str) {
8         if (str.charCodeAt(0) == 0xEF && str.charCodeAt(1) == 0xBB && str.charCodeAt(2) == 0xBF) {
9                 return Encoding.UTF8;
10         } else if (str.charCodeAt(0) == 0xFF && str.charCodeAt(1) == 0xFE) {
11                 return Encoding.UTF16;
12         } else {
13                 return Encoding.ASCII;
14         }
15 };
16 /* public */
17 Encoding.readUTF8 = function (str) {
18         var encoding = this.guessEncoding(str);
19         var startIdx = 0;
20         if (encoding == Encoding.UTF8) {
21                 startIdx = 3;
22         } else if (encoding == Encoding.UTF16) {
23                 startIdx = 2;
24         }
25         var arrs = new Array();
26         for (var i = startIdx; i < str.length; i++) {
27                 var charCode = str.charCodeAt(i);
28                 if (charCode < 0x80) {
29                         arrs[arrs.length] = str.charAt(i);
30                 } else if (charCode > 0xc0 && charCode < 0xe0) {
31                         var c1 = charCode & 0x1f;
32                         i++;
33                         var c2 = str.charCodeAt(i) & 0x3f;
34                         var c = (c1 << 6) + c2;
35                         arrs[arrs.length] = String.fromCharCode(c);
36                 } else if (charCode >= 0xe0) {
37                         var c1 = charCode & 0x0f;
38                         i++;
39                         var c2 = str.charCodeAt(i) & 0x3f;
40                         i++;
41                         var c3 = str.charCodeAt(i) & 0x3f;
42                         var c = (c1 << 12) + (c2 << 6) + c3;
43                         arrs[arrs.length] = String.fromCharCode(c);
44                 }
45         }
46         return arrs.join ('');
47 };
48 /* public */
49 Encoding.convert2UTF8 = function (str) {
50         var encoding = this.guessEncoding(str);
51         var startIdx = 0;
52         if (encoding == Encoding.UTF8) {
53                 return str;
54         } else if (encoding == Encoding.UTF16) {
55                 startIdx = 2;
56         }
57         
58         var offset = 0;
59         var arrs = new Array(offset + str.length - startIdx);
60         /*
61         arrs[0] = String.fromCharCode(0xEF).charAt(0);
62         arrs[1] = String.fromCharCode(0xBB).charAt(0);
63         arrs[2] = String.fromCharCode(0xBF).charAt(0);
64         */
65         for (var i = startIdx; i < str.length; i++) {
66                 var charCode = str.charCodeAt(i);
67                 if (charCode < 0x80) {
68                         arrs[offset + i - startIdx] = str.charAt(i);
69                 } else if (charCode <= 0x07ff) { //(charCode > 0xc0 && charCode < 0xe0) {
70                         var c1 = 0xc0 + ((charCode & 0x07c0) >> 6);
71                         var c2 = 0x80 + (charCode & 0x003f);
72                         arrs[offset + i - startIdx] = String.fromCharCode(c1) + String.fromCharCode(c2);
73                 } else {
74                         var c1 = 0xe0 + ((charCode & 0xf000) >> 12);
75                         var c2 = 0x80 + ((charCode & 0x0fc0) >> 6);
76                         var c3 = 0x80 + (charCode & 0x003f);
77                         arrs[offset + i - startIdx] = String.fromCharCode(c1) + String.fromCharCode(c2) + String.fromCharCode(c3);
78                 }
79         }
80         return arrs.join ('');
81 };
82 Encoding.base64Chars = new Array(
83     'A','B','C','D','E','F','G','H',
84     'I','J','K','L','M','N','O','P',
85     'Q','R','S','T','U','V','W','X',
86     'Y','Z','a','b','c','d','e','f',
87     'g','h','i','j','k','l','m','n',
88     'o','p','q','r','s','t','u','v',
89     'w','x','y','z','0','1','2','3',
90     '4','5','6','7','8','9','+','/'
91 );
92 Encoding.encodeBase64 = function (str) {
93         if (str == null || str.length == 0) return str;
94         var b64 = Encoding.base64Chars;
95         var length = str.length;
96         var index = 0;
97         var buf = [];
98         var c0, c1, c2;
99         while (index < length) {
100                 c0 = str.charCodeAt (index++);
101                 buf[buf.length] = b64[c0 >> 2];
102                 if (index < length) {
103                         c1 = str.charCodeAt (index++);
104             buf[buf.length] = b64[((c0 << 4 ) & 0x30) | (c1 >> 4)];
105             if (index < length){
106                                 c2 = str.charCodeAt (index++);
107                 buf[buf.length] = b64[((c1 << 2) & 0x3c) | (c2 >> 6)];
108                 buf[buf.length] = b64[c2 & 0x3F];
109             } else {
110                 buf[buf.length] = b64[((c1 << 2) & 0x3c)];
111                 buf[buf.length] = '=';
112             }
113                 } else {
114                         buf[buf.length] = b64[(c0 << 4) & 0x30];
115                         buf[buf.length] = '=';
116                         buf[buf.length] = '=';
117                 }
118         }
119         return buf.join ('');
120 };
121 Encoding.decodeBase64 = function (str) {
122         if (str == null || str.length == 0) return str;
123         var b64 = Encoding.base64Chars;
124         var xb64 = Encoding.xBase64Chars;
125         if (Encoding.xBase64Chars == null) {
126                 xb64 = new Object();
127                 for (var i = 0; i < b64.length; i++){
128                     xb64[b64[i]] = i;
129                 }
130                 Encoding.xBase64Chars = xb64;
131         }
132         var length = str.length;
133         var index = 0;
134         var buf = [];
135         var c0, c1, c2, c3;
136         var c = 0;
137         while (index < length && c++ < 60000) {
138                 c0 = xb64[str.charAt (index++)];
139                 c1 = xb64[str.charAt (index++)];
140                 c2 = xb64[str.charAt (index++)];
141                 c3 = xb64[str.charAt (index++)];
142                 buf[buf.length] = String.fromCharCode(((c0 << 2) & 0xff) | c1 >> 4);
143                 if (c2 != null) {
144                         buf[buf.length] = String.fromCharCode(((c1 << 4) & 0xff) | c2 >> 2);
145                         if (c3 != null) {
146                                 buf[buf.length] = String.fromCharCode(((c2 << 6) & 0xff) | c3);
147                         }
148                 }
149         }
150         return buf.join ('');
151 };