胡斌

support IE11: using utf16to8 and utf8to16 to replace TextEncode and TextDecoder

@@ -132,6 +132,7 @@ a:active { @@ -132,6 +132,7 @@ a:active {
132 132
133 <!-- functionality --> 133 <!-- functionality -->
134 <script type="text/javascript" src="scripts/swfobject.js"></script> 134 <script type="text/javascript" src="scripts/swfobject.js"></script>
  135 +<script type="text/javascript" src="scripts/utf.js"></script>
135 <script language="javascript"> 136 <script language="javascript">
136 137
137 var queryParameters = new Array(); 138 var queryParameters = new Array();
@@ -144,6 +145,7 @@ a:active { @@ -144,6 +145,7 @@ a:active {
144 var initload = true; 145 var initload = true;
145 var player; 146 var player;
146 147
  148 +
147 function testWebSocket() 149 function testWebSocket()
148 { 150 {
149 websocket = new WebSocket(wsUri); 151 websocket = new WebSocket(wsUri);
@@ -193,7 +195,8 @@ a:active { @@ -193,7 +195,8 @@ a:active {
193 offset += 4; 195 offset += 4;
194 var cam_name = new Uint8Array(evt.target.result, offset , cam_name_len - 1); 196 var cam_name = new Uint8Array(evt.target.result, offset , cam_name_len - 1);
195 offset += cam_name_len; 197 offset += cam_name_len;
196 - var data_sting = new TextDecoder("utf-8").decode(cam_name); 198 + //var data_sting = new TextDecoder("utf-8").decode(cam_name);
  199 + var data_sting = utf8to16(cam_name);
197 200
198 writeToScreen('<span style="color: blue;">Camera: ' + i + " " + data_sting + ' </span>'); 201 writeToScreen('<span style="color: blue;">Camera: ' + i + " " + data_sting + ' </span>');
199 var op = document.createElement("option"); 202 var op = document.createElement("option");
@@ -214,7 +217,8 @@ a:active { @@ -214,7 +217,8 @@ a:active {
214 offset += 4; 217 offset += 4;
215 var mic_name = new Uint8Array(evt.target.result, offset , mic_name_len - 1); 218 var mic_name = new Uint8Array(evt.target.result, offset , mic_name_len - 1);
216 offset += mic_name_len; 219 offset += mic_name_len;
217 - var data_sting = new TextDecoder("utf-8").decode(mic_name); 220 + //var data_sting = new TextDecoder("utf-8").decode(mic_name);
  221 + var data_sting = utf8to16(mic_name);
218 writeToScreen('<span style="color: blue;">MIC: ' + i + " " + data_sting + ' </span>'); 222 writeToScreen('<span style="color: blue;">MIC: ' + i + " " + data_sting + ' </span>');
219 var op = document.createElement("option"); 223 var op = document.createElement("option");
220 op.value = i; 224 op.value = i;
@@ -230,14 +234,16 @@ a:active { @@ -230,14 +234,16 @@ a:active {
230 } 234 }
231 else if(95 == result){//get_videoparam success 235 else if(95 == result){//get_videoparam success
232 var data = new Uint8Array(evt.target.result, 8, evt.target.result.byteLength - 8 -1); 236 var data = new Uint8Array(evt.target.result, 8, evt.target.result.byteLength - 8 -1);
233 - var data_sting = new TextDecoder("utf-8").decode(data); 237 + //var data_sting = new TextDecoder("utf-8").decode(data);
  238 + var data_sting = utf8to16(data);
234 var td = document.getElementById('videoparam'); 239 var td = document.getElementById('videoparam');
235 td.value = data_sting; 240 td.value = data_sting;
236 writeToScreen('<span style="color: blue;">get_videoparam result: ' + data_sting + ' </span>'); 241 writeToScreen('<span style="color: blue;">get_videoparam result: ' + data_sting + ' </span>');
237 } 242 }
238 else{ 243 else{
239 var data = new Uint8Array(evt.target.result, 8, evt.target.result.byteLength - 8); 244 var data = new Uint8Array(evt.target.result, 8, evt.target.result.byteLength - 8);
240 - var data_sting = new TextDecoder("utf-8").decode(data); 245 + //var data_sting = new TextDecoder("utf-8").decode(data);
  246 + var data_sting = utf8to16(data);
241 writeToScreen('<span style="color: blue;">RESPONSE: ' + data_sting + ' </span>'); 247 writeToScreen('<span style="color: blue;">RESPONSE: ' + data_sting + ' </span>');
242 } 248 }
243 } 249 }
@@ -292,7 +298,8 @@ a:active { @@ -292,7 +298,8 @@ a:active {
292 else if(obj.id == "ss_start"){ 298 else if(obj.id == "ss_start"){
293 cmd.type = 6; 299 cmd.type = 6;
294 var param = document.getElementById("ss_start_input"); 300 var param = document.getElementById("ss_start_input");
295 - cmd.data = new TextEncoder("utf-8").encode(param.value); 301 + //cmd.data = new TextEncoder("utf-8").encode(param.value);
  302 + cmd.data = utf16to8(param.value);
296 cmd.data_len = cmd.data.length; 303 cmd.data_len = cmd.data.length;
297 } 304 }
298 else if(obj.id == "ss_stop"){ 305 else if(obj.id == "ss_stop"){
@@ -322,7 +329,8 @@ a:active { @@ -322,7 +329,8 @@ a:active {
322 329
323 var window_name_buffer = new Uint8Array(buffer, 24, 256); 330 var window_name_buffer = new Uint8Array(buffer, 24, 256);
324 var window_name = document.getElementById("ds_start_window_name").value; 331 var window_name = document.getElementById("ds_start_window_name").value;
325 - var window_name_array = new TextEncoder("utf-8").encode(window_name); 332 + //var window_name_array = new TextEncoder("utf-8").encode(window_name);
  333 + var window_name_array = utf16to8(window_name);
326 for(var i=0;i< window_name_array.length; i++){ 334 for(var i=0;i< window_name_array.length; i++){
327 window_name_buffer[i] = window_name_array[i]; 335 window_name_buffer[i] = window_name_array[i];
328 } 336 }
@@ -350,7 +358,8 @@ a:active { @@ -350,7 +358,8 @@ a:active {
350 var urlname_len = new Uint32Array(buffer, 4, 1); 358 var urlname_len = new Uint32Array(buffer, 4, 1);
351 urlname_len[0] = 0; 359 urlname_len[0] = 0;
352 var mic_name = new Uint8Array(buffer, 8, 256); 360 var mic_name = new Uint8Array(buffer, 8, 256);
353 - var mic_name_array = new TextEncoder("utf-8").encode(sel_mic_name); 361 + //var mic_name_array = new TextEncoder("utf-8").encode(sel_mic_name);
  362 + var mic_name_array = utf16to8(sel_mic_name);
354 for(var i=0;i< mic_name_array.length; i++){ 363 for(var i=0;i< mic_name_array.length; i++){
355 mic_name[i] = mic_name_array[i]; 364 mic_name[i] = mic_name_array[i];
356 } 365 }
@@ -377,7 +386,8 @@ a:active { @@ -377,7 +386,8 @@ a:active {
377 var urlname_len = new Uint32Array(buffer, 4, 1); 386 var urlname_len = new Uint32Array(buffer, 4, 1);
378 urlname_len[0] = 0; 387 urlname_len[0] = 0;
379 var cam_name = new Uint8Array(buffer, 8, 256); 388 var cam_name = new Uint8Array(buffer, 8, 256);
380 - var cam_name_array = new TextEncoder("utf-8").encode(sel_cam_name); 389 + //var cam_name_array = new TextEncoder("utf-8").encode(sel_cam_name);
  390 + var cam_name_array = utf16to8(sel_cam_name);
381 for(var i=0;i< cam_name_array.length; i++){ 391 for(var i=0;i< cam_name_array.length; i++){
382 cam_name[i] = cam_name_array[i]; 392 cam_name[i] = cam_name_array[i];
383 } 393 }
@@ -392,38 +402,41 @@ a:active { @@ -392,38 +402,41 @@ a:active {
392 else if(obj.id == "set_videoparam"){ 402 else if(obj.id == "set_videoparam"){
393 cmd.type = 46; 403 cmd.type = 46;
394 var param = document.getElementById("videoparam"); 404 var param = document.getElementById("videoparam");
395 - cmd.data = new TextEncoder("utf-8").encode(param.value); 405 + //cmd.data = new TextEncoder("utf-8").encode(param.value);
  406 + cmd.data = utf16to8(param.value);
396 cmd.data_len = cmd.data.length; 407 cmd.data_len = cmd.data.length;
397 } 408 }
398 else if(obj.id == "get_videoparam"){ 409 else if(obj.id == "get_videoparam"){
399 cmd.type = 47; 410 cmd.type = 47;
400 var sourceSel = document.getElementById("sources"); 411 var sourceSel = document.getElementById("sources");
401 var index = sourceSel.selectedIndex; 412 var index = sourceSel.selectedIndex;
402 - cmd.data = new TextEncoder("utf-8").encode(sourceSel.options[index].text); 413 + //cmd.data = new TextEncoder("utf-8").encode(sourceSel.options[index].text);
  414 + cmd.data = utf16to8(sourceSel.options[index].text);
403 cmd.data_len = cmd.data.length; 415 cmd.data_len = cmd.data.length;
404 } 416 }
405 else if(obj.id == "start_record"){ 417 else if(obj.id == "start_record"){
406 cmd.type = 48; 418 cmd.type = 48;
407 var param = document.getElementById("start_record_input"); 419 var param = document.getElementById("start_record_input");
408 - cmd.data = new TextEncoder("utf-8").encode(param.value); 420 + //cmd.data = new TextEncoder("utf-8").encode(param.value);
  421 + cmd.data = utf16to8(param.value);
409 cmd.data_len = cmd.data.length; 422 cmd.data_len = cmd.data.length;
410 } 423 }
411 else if(obj.id == "stop_record"){ 424 else if(obj.id == "stop_record"){
412 cmd.type = 49; 425 cmd.type = 49;
413 var param = document.getElementById("start_record_input"); 426 var param = document.getElementById("start_record_input");
414 - cmd.data = new TextEncoder("utf-8").encode(param.value); 427 + cmd.data = utf16to8(param.value);
415 cmd.data_len = cmd.data.length; 428 cmd.data_len = cmd.data.length;
416 } 429 }
417 else if(obj.id == "start_push"){ 430 else if(obj.id == "start_push"){
418 cmd.type = 50; 431 cmd.type = 50;
419 var param = document.getElementById("start_push_input"); 432 var param = document.getElementById("start_push_input");
420 - cmd.data = new TextEncoder("utf-8").encode(param.value); 433 + cmd.data = utf16to8(param.value);
421 cmd.data_len = cmd.data.length; 434 cmd.data_len = cmd.data.length;
422 } 435 }
423 else if(obj.id == "stop_push"){ 436 else if(obj.id == "stop_push"){
424 cmd.type = 51; 437 cmd.type = 51;
425 var param = document.getElementById("start_push_input"); 438 var param = document.getElementById("start_push_input");
426 - cmd.data = new TextEncoder("utf-8").encode(param.value); 439 + cmd.data = utf16to8(param.value);
427 cmd.data_len = cmd.data.length; 440 cmd.data_len = cmd.data.length;
428 } 441 }
429 442
  1 +/* utf.js - UTF-8 <=> UTF-16 convertion
  2 + *
  3 + * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
  4 + * Version: 1.0
  5 + * LastModified: Dec 25 1999
  6 + * This library is free. You can redistribute it and/or modify it.
  7 + */
  8 +/* hubin modified, to convert from Utf16String to Uint8Array and convert
  9 +Uint8Array to Utf16String
  10 +*/
  11 +/*
  12 + * Interfaces:
  13 + * utf8 = utf16to8(utf16);
  14 + * utf16 = utf16to8(utf8);
  15 + */
  16 +
  17 +function utf16to8(str) {
  18 + var out, i, len, c;
  19 +
  20 + len = str.length;
  21 + out = new Uint8Array(len * 3);
  22 + var utf8len = 0;
  23 + for(i = 0; i < len; i++) {
  24 + c = str.charCodeAt(i);
  25 + if ((c >= 0x0001) && (c <= 0x007F)) {
  26 + out[utf8len++] = c;
  27 + } else if (c > 0x07FF) {
  28 + out[utf8len++] = (0xE0 | ((c >> 12) & 0x0F));
  29 + out[utf8len++] = (0x80 | ((c >> 6) & 0x3F));
  30 + out[utf8len++] = (0x80 | ((c >> 0) & 0x3F));
  31 + } else {
  32 + out[utf8len++] = (0xC0 | ((c >> 6) & 0x1F));
  33 + out[utf8len++] = (0x80 | ((c >> 0) & 0x3F));
  34 + }
  35 + }
  36 + return new Uint8Array(out.buffer, 0, utf8len);
  37 +}
  38 +
  39 +function utf8to16(str) {
  40 + var out, i, len, c;
  41 + var char2, char3;
  42 +
  43 + out = "";
  44 + len = str.length;
  45 + i = 0;
  46 + while(i < len) {
  47 + c = str[i++];
  48 + switch(c >> 4)
  49 + {
  50 + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
  51 + // 0xxxxxxx
  52 + out += String.fromCharCode(c);
  53 + break;
  54 + case 12: case 13:
  55 + // 110x xxxx 10xx xxxx
  56 + char2 = str[i++];
  57 + out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
  58 + break;
  59 + case 14:
  60 + // 1110 xxxx 10xx xxxx 10xx xxxx
  61 + char2 = str[i++];
  62 + char3 = str[i++];
  63 + out += String.fromCharCode(((c & 0x0F) << 12) |
  64 + ((char2 & 0x3F) << 6) |
  65 + ((char3 & 0x3F) << 0));
  66 + break;
  67 + }
  68 + }
  69 +
  70 + return out;
  71 +}