1var sjisCPs = []; // index is unicode cp, value is pointer 2for (var p = 0; p < 8272; p++) { 3 if (jis0208[p] != null && sjisCPs[jis0208[p]] == null) { 4 sjisCPs[jis0208[p]] = p; 5 } 6} 7for (p = 8836; p < jis0208.length; p++) { 8 if (jis0208[p] != null && sjisCPs[jis0208[p]] == null) { 9 sjisCPs[jis0208[p]] = p; 10 } 11} 12 13function chars2cps(chars) { 14 // this is needed because of javascript's handling of supplementary characters 15 // char: a string of unicode characters 16 // returns an array of decimal code point values 17 var haut = 0; 18 var out = []; 19 for (var i = 0; i < chars.length; i++) { 20 var b = chars.charCodeAt(i); 21 if (b < 0 || b > 0xffff) { 22 alert("Error in chars2cps: byte out of range " + b.toString(16) + "!"); 23 } 24 if (haut != 0) { 25 if (0xdc00 <= b && b <= 0xdfff) { 26 out.push(0x10000 + ((haut - 0xd800) << 10) + (b - 0xdc00)); 27 haut = 0; 28 continue; 29 } else { 30 alert( 31 "Error in chars2cps: surrogate out of range " + 32 haut.toString(16) + 33 "!" 34 ); 35 haut = 0; 36 } 37 } 38 if (0xd800 <= b && b <= 0xdbff) { 39 haut = b; 40 } else { 41 out.push(b); 42 } 43 } 44 return out; 45} 46 47function sjisEncoder(stream) { 48 var cps = chars2cps(stream); 49 var out = ""; 50 var cp; 51 var finished = false; 52 var endofstream = 2000000; 53 var temp, offset, leadoffset, first, second; 54 while (!finished) { 55 if (cps.length == 0) cp = endofstream; 56 else cp = cps.shift(); 57 58 if (cp == endofstream) { 59 finished = true; 60 continue; 61 } 62 if ((cp >= 0x00 && cp <= 0x7f) || cp == 0x80) { 63 out += " " + cp.toString(16).toUpperCase(); 64 continue; 65 } 66 if (cp == 0xa5) { 67 out += " 5C"; 68 continue; 69 } 70 if (cp == 0x203e) { 71 out += " 7E"; 72 continue; 73 } 74 if (cp >= 0xff61 && cp <= 0xff9f) { 75 temp = cp - 0xff61 + 0xa1; 76 out += " " + temp.toString(16).toUpperCase(); 77 continue; 78 } 79 if (cp == 0x2212) { 80 cp = 0xff0d; 81 } 82 var ptr = sjisCPs[cp]; 83 if (ptr == null) { 84 return null; 85 // out += ' &#'+cp+';' 86 // continue 87 } 88 var lead = Math.floor(ptr / 188); 89 if (lead < 0x1f) leadoffset = 0x81; 90 else leadoffset = 0xc1; 91 var trail = ptr % 188; 92 first = lead + leadoffset; 93 if (trail < 0x3f) offset = 0x40; 94 else offset = 0x41; 95 second = trail + offset; 96 out += 97 " " + 98 first.toString(16).toUpperCase() + 99 " " + 100 second.toString(16).toUpperCase(); 101 } 102 return out.trim(); 103} 104 105function convertToHex(str) { 106 // converts a string of ASCII characters to hex byte codes 107 var out = ""; 108 var result; 109 for (var c = 0; c < str.length; c++) { 110 result = str.charCodeAt(c).toString(16).toUpperCase() + " "; 111 out += result; 112 } 113 return out; 114} 115 116function normalizeStr(str) { 117 var out = ""; 118 for (var c = 0; c < str.length; c++) { 119 if (str.charAt(c) == "%") { 120 out += String.fromCodePoint( 121 parseInt(str.charAt(c + 1) + str.charAt(c + 2), 16) 122 ); 123 c += 2; 124 } else out += str.charAt(c); 125 } 126 var result = ""; 127 for (var o = 0; o < out.length; o++) { 128 result += "%" + out.charCodeAt(o).toString(16).toUpperCase(); 129 } 130 return result.replace(/%1B%28%42$/, ""); 131} 132