• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1function dec2char(n) {
2    // converts a decimal number to a Unicode character
3    // n: the dec codepoint value to be converted
4    if (n <= 0xffff) {
5        out = String.fromCharCode(n);
6    } else if (n <= 0x10ffff) {
7        n -= 0x10000;
8        out =
9            String.fromCharCode(0xd800 | (n >> 10)) +
10            String.fromCharCode(0xdc00 | (n & 0x3ff));
11    } else out = "dec2char error: Code point out of range: " + n;
12    return out;
13}
14
15function eucjpDecoder(stream) {
16    stream = stream.replace(/%/g, " ");
17    stream = stream.replace(/[\s]+/g, " ").trim();
18    var bytes = stream.split(" ");
19    for (var i = 0; i < bytes.length; i++) bytes[i] = parseInt(bytes[i], 16);
20    var out = "";
21
22    var lead, byte, offset, ptr, cp;
23    var jis0212flag = false;
24    var eucjpLead = 0x00;
25    var endofstream = 2000000;
26    var finished = false;
27
28    while (!finished) {
29        if (bytes.length == 0) byte = endofstream;
30        else byte = bytes.shift();
31
32        if (byte == endofstream && eucjpLead != 0x00) {
33            eucjpLead = 0x00;
34            out += "�";
35            continue;
36        }
37        if (byte == endofstream && eucjpLead == 0x00) {
38            finished = true;
39            continue;
40        }
41        if (eucjpLead == 0x8e && byte >= 0xa1 && byte <= 0xdf) {
42            eucjpLead = 0x00;
43            out += dec2char(0xff61 + byte - 0xa1);
44            continue;
45        }
46        if (eucjpLead == 0x8f && byte >= 0xa1 && byte <= 0xfe) {
47            jis0212flag = true;
48            eucjpLead = byte;
49            continue;
50        }
51        if (eucjpLead != 0x00) {
52            lead = eucjpLead;
53            eucjpLead = 0x00;
54            cp = null;
55
56            if (
57                lead >= 0xa1 &&
58                lead <= 0xfe &&
59                (byte >= 0xa1 && byte <= 0xfe)
60            ) {
61                ptr = (lead - 0xa1) * 94 + byte - 0xa1;
62                if (jis0212flag) cp = jis0212[ptr];
63                else cp = jis0208[ptr];
64            }
65            jis0212flag = false;
66            if (cp != null) {
67                out += dec2char(cp);
68                continue;
69            }
70            if (byte >= 0x00 && byte <= 0x7f) bytes.unshift(byte);
71            out += "�";
72            continue;
73        }
74        if (byte >= 0x00 && byte <= 0x7f) {
75            out += dec2char(byte);
76            continue;
77        }
78        if (byte == 0x8e || byte == 0x8f || (byte >= 0xa1 && byte <= 0xfe)) {
79            eucjpLead = byte;
80            continue;
81        }
82        out += "�";
83    }
84    return out;
85}
86