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