0

Im making a small game which uses the print function for the GUI,With an ascii-like style.

The problem is that some of the ALT-Codes such as ▲ come up in the program as a ? or as something else,

Is there a possible fix to this? or which alt-codes can be used?

Im using JCreator

leppie
  • 115,091
  • 17
  • 196
  • 297
user3670236
  • 133
  • 1
  • 3
  • 13

1 Answers1

2

The glyphs (graphical representations) for non-printing ASCII bytes were never standardized. Character 30 has no standard glyph. Bytes 128-255 also have no standard glyphs. If you want to reliably display the glyphs from a particular pre-Unicode glyph set, you need to identify Unicode characters with glyphs that look like the old glyphs, and convert your byte values to those Unicode characters. For example, here's a table of Unicode characters that look similar to IBM codepage 437:

char[] decoded = new char[] {
    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
    0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
    0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
    0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
    0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
    0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
    0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
    0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,
    0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,
    0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
    0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
    0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
    0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
    0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
    0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
    0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
    0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,
    0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,
    0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,
    0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0
};

And actually, some of the values in this table are wrong. You'll need to fill in the correct values from a source like this. Note that there is more than one correct Unicode character for some bytes, depending on which old glyph set you're trying to imitate.

Then convert your byte values to an ints in the range 0-255, and use the character at that index in the conversion table:

// bytes is a byte[] containing ASCII
char[] chars = new char[bytes.length];
for(int i = 0; i < bytes.length; ++i) {
   chars[i] = decoded[bytes[i] & 0xFF];
}
String s = new String(chars);
System.out.println(s);
Kevin Krumwiede
  • 9,868
  • 4
  • 34
  • 82
  • Thanks for the info,how would i exactly use that to print the ▲ for example? Im kind of new to java once again,thanks ^^ – user3670236 Sep 06 '14 at 18:31
  • You might need to change your font to one that has glyphs for all the code points: http://stackoverflow.com/questions/10764920/utf-16-on-cmd-exe – Kevin Krumwiede Sep 06 '14 at 23:20