Issue#311: Can't show Chinese VM name correctly

Chinese characters have 3 bytes each after decoded by base64, and we need
combine 3 bytes into 1 2-byte unicode for String.fromCharCode(number); to
decode the character correctly.

Signed-off-by: Hongliang Wang <hlwang@linux.vnet.ibm.com>
This commit is contained in:
Hongliang Wang 2014-05-19 15:03:23 +08:00
parent dd3a8a1b6d
commit 7a17435cd8
2 changed files with 42 additions and 1 deletions

View File

@ -919,7 +919,7 @@ init_msg = function() {
/* Connection name/title */ /* Connection name/title */
name_length = ws.rQshift32(); name_length = ws.rQshift32();
fb_name = Util.decodeUTF8(ws.rQshiftStr(name_length)); fb_name = Util.decodeUTF8(ws.rQshiftUStr(name_length));
conf.onDesktopName(that, fb_name); conf.onDesktopName(that, fb_name);
if (conf.true_color && fb_name === "Intel(r) AMT KVM") if (conf.true_color && fb_name === "Intel(r) AMT KVM")

View File

@ -121,6 +121,46 @@ function rQshiftStr(len) {
rQi += len; rQi += len;
return String.fromCharCode.apply(null, arr); return String.fromCharCode.apply(null, arr);
} }
function rQshiftUTFStr(len) {
if (typeof(len) === 'undefined') { len = rQlen(); }
var arr = [];
for(var i = rQi; i < rQi + len; i++) {
var code = rQ[i];
// 1-byte
if(code <= 0x7f) {
arr.push(code);
continue;
}
// 2-byte
if(code <= 0xdf) {
var sec = rQ[++i];
code = ((code & 0x1c) << 6) | (sec & 0x3f);
arr.push(code);
continue;
}
// 3-byte
if(code <= 0xef) {
var sec = rQ[++i];
var thi = rQ[++i];
code = ((((code & 0xf) << 4) | ((sec & 0x3c) >> 2)) << 8) | (((sec & 0x3) << 6) | (thi & 0x3f));
arr.push(code);
continue;
}
// 4-byte
if(code <= 0xf7) {
var sec = rQ[++i];
var thi = rQ[++i];
var fou = rQ[++i];
var z = ((code & 0x7) << 2) | ((sec & 0x30) >> 4);
var y = ((sec & 0xf) << 4) | ((thi & 0x3c) >> 2);
var x = ((thi & 0x3) << 6) | (fou & 0x 3f);
code = (z << 16) | (y << 8) | x;
arr.push(code);
}
}
rQi += len;
return String.fromCharCode.apply(null, arr);
}
function rQshiftBytes(len) { function rQshiftBytes(len) {
if (typeof(len) === 'undefined') { len = rQlen(); } if (typeof(len) === 'undefined') { len = rQlen(); }
rQi += len; rQi += len;
@ -400,6 +440,7 @@ function constructor() {
api.rQshift16 = rQshift16; api.rQshift16 = rQshift16;
api.rQshift32 = rQshift32; api.rQshift32 = rQshift32;
api.rQshiftStr = rQshiftStr; api.rQshiftStr = rQshiftStr;
api.rQshiftUStr = rQshiftUTFStr;
api.rQshiftBytes = rQshiftBytes; api.rQshiftBytes = rQshiftBytes;
api.rQslice = rQslice; api.rQslice = rQslice;
api.rQwait = rQwait; api.rQwait = rQwait;