Update Apple IIc to include Unicode 13.0 symbols.

This commit is contained in:
2021-04-30 12:02:28 +01:00
parent a390eb1c5a
commit 23fdff225d
3 changed files with 233 additions and 182 deletions

View File

@@ -61,7 +61,7 @@ namespace Claunia.Encoding.Tests
0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0E, 0x0F, 0x11, 0x12, 0x13, 0x14, 0x15, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0E, 0x0F, 0x11, 0x12, 0x13, 0x14, 0x15,
0x16, 0x17, 0x18, 0x19, 0x1A 0x16, 0x17, 0x18, 0x19, 0x1A
}; };
const string ARROWS = "↑↓←→◀▶"; const string ARROWS = "↑↓←→🢰◀▶";
readonly byte[] _arrowsBytes = readonly byte[] _arrowsBytes =
{ {
0x1C, 0x1D, 0x1E, 0x1F, 0x7D, 0x7E, 0x7F 0x1C, 0x1D, 0x1E, 0x1F, 0x7D, 0x7E, 0x7F

View File

@@ -114,7 +114,7 @@ namespace Claunia.Encoding.Tests
0xA9, 0xAA, 0xAB, 0xAC, 0xDE, 0xDF, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xA9, 0xAA, 0xAB, 0xAC, 0xDE, 0xDF, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
0xFB, 0xFC, 0xFD, 0xFE 0xFB, 0xFC, 0xFD, 0xFE
}; };
const string SYMBOLS = "⇧⇩⇨⇦✓♪ə"; const string SYMBOLS = "⇧⇩⇨⇦🮽✓♪ə";
readonly byte[] _symbolsBytes = readonly byte[] _symbolsBytes =
{ {
0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0B, 0x1A 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0B, 0x1A

View File

@@ -24,10 +24,12 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
using System.Text;
namespace Claunia.Encoding namespace Claunia.Encoding
{ {
/// <summary>Represents an Apple IIc character encoding of Unicode characters.</summary> /// <summary>Represents an Apple IIc character encoding of Unicode characters.</summary>
public sealed class Apple2C : SingleByteEncoding public sealed class Apple2C : SingleByteEncodingWithRunes
{ {
public override string BodyName => "apple2c"; public override string BodyName => "apple2c";
public override int CodePage => 0; public override int CodePage => 0;
@@ -44,254 +46,303 @@ namespace Claunia.Encoding
public override bool IsSingleByte => true; public override bool IsSingleByte => true;
/// <summary>The Apple IIc to Unicode character map. Inverted screen characters are mapped to normal characters.</summary> /// <summary>The Apple IIc to Unicode character map. Inverted screen characters are mapped to normal characters.</summary>
protected override char[] CharTable => new[] protected override Rune[] CharTable => new[]
{ {
// 0x00 // 0x00
'\u0000', '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\u0007', new Rune(0x0000), new Rune(0x0001), new Rune(0x0002), new Rune(0x0003), new Rune(0x0004), new Rune(0x0005),
new Rune(0x0006), new Rune(0x0007),
// 0x08 // 0x08
'\u0008', '\u0009', '\u000A', '\u000B', '\u000C', '\u000D', '\u000E', '\u000F', new Rune(0x0008), new Rune(0x0009), new Rune(0x000A), new Rune(0x000B), new Rune(0x000C), new Rune(0x000D),
new Rune(0x000E), new Rune(0x000F),
// 0x10 // 0x10
'\u0010', '\u0011', '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017', new Rune(0x0010), new Rune(0x0011), new Rune(0x0012), new Rune(0x0013), new Rune(0x0014), new Rune(0x0015),
new Rune(0x0016), new Rune(0x0017),
// 0x18 // 0x18
'\u0018', '\u0019', '\u001A', '\u001B', '\u001C', '\u001D', '\u001E', '\u001F', new Rune(0x0018), new Rune(0x0019), new Rune(0x001A), new Rune(0x001B), new Rune(0x001C), new Rune(0x001D),
new Rune(0x001E), new Rune(0x001F),
// 0x20 // 0x20
'\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\u0027', new Rune(0x0020), new Rune(0x0021), new Rune(0x0022), new Rune(0x0023), new Rune(0x0024), new Rune(0x0025),
new Rune(0x0026), new Rune(0x0027),
// 0x28 // 0x28
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F', new Rune(0x0028), new Rune(0x0029), new Rune(0x002A), new Rune(0x002B), new Rune(0x002C), new Rune(0x002D),
new Rune(0x002E), new Rune(0x002F),
// 0x30 // 0x30
'\u0030', '\u0031', '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037', new Rune(0x0030), new Rune(0x0031), new Rune(0x0032), new Rune(0x0033), new Rune(0x0034), new Rune(0x0035),
new Rune(0x0036), new Rune(0x0037),
// 0x38 // 0x38
'\u0038', '\u0039', '\u003A', '\u003B', '\u003C', '\u003D', '\u003E', '\u003F', new Rune(0x0038), new Rune(0x0039), new Rune(0x003A), new Rune(0x003B), new Rune(0x003C), new Rune(0x003D),
new Rune(0x003E), new Rune(0x003F),
// 0x40 // 0x40
'\u0040', '\u0041', '\u0042', '\u0043', '\u0044', '\u0045', '\u0046', '\u0047', new Rune(0x0040), new Rune(0x0041), new Rune(0x0042), new Rune(0x0043), new Rune(0x0044), new Rune(0x0045),
new Rune(0x0046), new Rune(0x0047),
// 0x48 // 0x48
'\u0048', '\u0049', '\u004A', '\u004B', '\u004C', '\u004D', '\u004E', '\u004F', new Rune(0x0048), new Rune(0x0049), new Rune(0x004A), new Rune(0x004B), new Rune(0x004C), new Rune(0x004D),
new Rune(0x004E), new Rune(0x004F),
// 0x50 // 0x50
'\u0050', '\u0051', '\u0052', '\u0053', '\u0054', '\u0055', '\u0056', '\u0057', new Rune(0x0050), new Rune(0x0051), new Rune(0x0052), new Rune(0x0053), new Rune(0x0054), new Rune(0x0055),
new Rune(0x0056), new Rune(0x0057),
// 0x58 // 0x58
'\u0058', '\u0059', '\u005A', '\u005B', '\u00A3', '\u005D', '\u005E', '\u005F', new Rune(0x0058), new Rune(0x0059), new Rune(0x005A), new Rune(0x005B), new Rune(0x00A3), new Rune(0x005D),
new Rune(0x005E), new Rune(0x005F),
// 0x60 // 0x60
'\u0060', '\u0061', '\u0062', '\u0063', '\u0064', '\u0065', '\u0066', '\u0067', new Rune(0x0060), new Rune(0x0061), new Rune(0x0062), new Rune(0x0063), new Rune(0x0064), new Rune(0x0065),
new Rune(0x0066), new Rune(0x0067),
// 0x68 // 0x68
'\u0068', '\u0069', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E', '\u006F', new Rune(0x0068), new Rune(0x0069), new Rune(0x006A), new Rune(0x006B), new Rune(0x006C), new Rune(0x006D),
new Rune(0x006E), new Rune(0x006F),
// 0x70 // 0x70
'\u0070', '\u0071', '\u0072', '\u0073', '\u0074', '\u0075', '\u0076', '\u0077', new Rune(0x0070), new Rune(0x0071), new Rune(0x0072), new Rune(0x0073), new Rune(0x0074), new Rune(0x0075),
new Rune(0x0076), new Rune(0x0077),
// 0x78 // 0x78
'\u0078', '\u0079', '\u007A', '\u007B', '\u007C', '\u007D', '\u007E', '\u007F', new Rune(0x0078), new Rune(0x0079), new Rune(0x007A), new Rune(0x007B), new Rune(0x007C), new Rune(0x007D),
new Rune(0x007E), new Rune(0x007F),
// 0x80 // 0x80
'\u0040', '\u0041', '\u0042', '\u0043', '\u0044', '\u0045', '\u0046', '\u0047', new Rune(0x0040), new Rune(0x0041), new Rune(0x0042), new Rune(0x0043), new Rune(0x0044), new Rune(0x0045),
new Rune(0x0046), new Rune(0x0047),
// 0x88 // 0x88
'\u0048', '\u0049', '\u004A', '\u004B', '\u004C', '\u004D', '\u004E', '\u004F', new Rune(0x0048), new Rune(0x0049), new Rune(0x004A), new Rune(0x004B), new Rune(0x004C), new Rune(0x004D),
new Rune(0x004E), new Rune(0x004F),
// 0x90 // 0x90
'\u0050', '\u0051', '\u0052', '\u0053', '\u0054', '\u0055', '\u0056', '\u0057', new Rune(0x0050), new Rune(0x0051), new Rune(0x0052), new Rune(0x0053), new Rune(0x0054), new Rune(0x0055),
new Rune(0x0056), new Rune(0x0057),
// 0x98 // 0x98
'\u0058', '\u0059', '\u005A', '\u005B', '\u00A3', '\u005D', '\u005E', '\u0020', new Rune(0x0058), new Rune(0x0059), new Rune(0x005A), new Rune(0x005B), new Rune(0x00A3), new Rune(0x005D),
new Rune(0x005E), new Rune(0x0020),
// 0xA0 // 0xA0
'\u2588', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\u0027', new Rune(0x2588), new Rune(0x0021), new Rune(0x0022), new Rune(0x0023), new Rune(0x0024), new Rune(0x0025),
new Rune(0x0026), new Rune(0x0027),
// 0xA8 // 0xA8
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F', new Rune(0x0028), new Rune(0x0029), new Rune(0x002A), new Rune(0x002B), new Rune(0x002C), new Rune(0x002D),
new Rune(0x002E), new Rune(0x002F),
// 0xB0 // 0xB0
'\u0030', '\u0031', '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037', new Rune(0x0030), new Rune(0x0031), new Rune(0x0032), new Rune(0x0033), new Rune(0x0034), new Rune(0x0035),
new Rune(0x0036), new Rune(0x0037),
// 0xB8 // 0xB8
'\u0030', '\u0031', '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037', new Rune(0x0030), new Rune(0x0031), new Rune(0x0032), new Rune(0x0033), new Rune(0x0034), new Rune(0x0035),
new Rune(0x0036), new Rune(0x0037),
// 0xC0 // 0xC0
'\u0000', '\u0000', '\u0000', '\u231B', '\u2713', '\u0000', '\u0000', '\u0000', new Rune(0xF8FF), new Rune(0x0000), new Rune(0x1FBB0), new Rune(0x231B), new Rune(0x2713),
new Rune(0x1FBB1), new Rune(0x1FBB2), new Rune(0x1FBB3),
// 0xC8 // 0xC8
'\u2190', '\u2026', '\u2193', '\u2191', '\u0000', '\u21B5', '\u0000', '\u0000', new Rune(0x2190), new Rune(0x2026), new Rune(0x2193), new Rune(0x2191), new Rune(0x1FB76), new Rune(0x21B5),
new Rune(0x2589), new Rune(0x1FBB5),
// 0xD0 // 0xD0
'\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u2192', '\u0000', '\u0000', new Rune(0x1FBB6), new Rune(0x1FBB7), new Rune(0x1FBB8), new Rune(0x2500), new Rune(0x1FB7C),
new Rune(0x2192), new Rune(0x2592), new Rune(0x1FB90),
// 0xD8 // 0xD8
'\u0000', '\u0000', '\u0000', '\u25c6', '\u0000', '\u0000', '\u0000', '\u0000', new Rune(0x1FBB9), new Rune(0x1FBBA), new Rune(0x2595), new Rune(0x25c6), new Rune(0x1FB80),
new Rune(0x1FBBB), new Rune(0x1FBBC), new Rune(0x258F),
// 0xE0 // 0xE0
'\u0060', '\u0061', '\u0062', '\u0063', '\u0064', '\u0065', '\u0066', '\u0067', new Rune(0x0060), new Rune(0x0061), new Rune(0x0062), new Rune(0x0063), new Rune(0x0064), new Rune(0x0065),
new Rune(0x0066), new Rune(0x0067),
// 0xE8 // 0xE8
'\u0068', '\u0069', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E', '\u006F', new Rune(0x0068), new Rune(0x0069), new Rune(0x006A), new Rune(0x006B), new Rune(0x006C), new Rune(0x006D),
new Rune(0x006E), new Rune(0x006F),
// 0xF0 // 0xF0
'\u0070', '\u0071', '\u0072', '\u0073', '\u0074', '\u0075', '\u0076', '\u0077', new Rune(0x0070), new Rune(0x0071), new Rune(0x0072), new Rune(0x0073), new Rune(0x0074), new Rune(0x0075),
new Rune(0x0076), new Rune(0x0077),
// 0xF8 // 0xF8
'\u0078', '\u0079', '\u007A', '\u007B', '\u007C', '\u007D', '\u007E', '\u007F' new Rune(0x0078), new Rune(0x0079), new Rune(0x007A), new Rune(0x007B), new Rune(0x007C), new Rune(0x007D),
new Rune(0x007E), new Rune(0x007F)
}; };
/// <summary>Converts a Unicode character to an Apple IIc character</summary> /// <summary>Converts a Unicode character to an Apple IIc character</summary>
/// <returns>Apple IIc character.</returns> /// <returns>Apple IIc character.</returns>
/// <param name="character">Unicode character.</param> /// <param name="character">Unicode character.</param>
private protected override byte GetByte(char character) private protected override byte GetByte(Rune character) => character.Value switch
{ {
switch(character) 0x0000 => 0x00,
{ 0x0001 => 0x01,
case '\u0000': return 0x00; 0x0002 => 0x02,
case '\u0001': return 0x01; 0x0003 => 0x03,
case '\u0002': return 0x02; 0x0004 => 0x04,
case '\u0003': return 0x03; 0x0005 => 0x05,
case '\u0004': return 0x04; 0x0006 => 0x06,
case '\u0005': return 0x05; 0x0007 => 0x07,
case '\u0006': return 0x06; 0x0008 => 0x08,
case '\u0007': return 0x07; 0x0009 => 0x09,
case '\u0008': return 0x08; 0x000A => 0x0A,
case '\u0009': return 0x09; 0x000B => 0x0B,
case '\u000A': return 0x0A; 0x000C => 0x0C,
case '\u000B': return 0x0B; 0x000D => 0x0D,
case '\u000C': return 0x0C; 0x000E => 0x0E,
case '\u000D': return 0x0D; 0x000F => 0x0F,
case '\u000E': return 0x0E; 0x0010 => 0x10,
case '\u000F': return 0x0F; 0x0011 => 0x11,
case '\u0010': return 0x10; 0x0012 => 0x12,
case '\u0011': return 0x11; 0x0013 => 0x13,
case '\u0012': return 0x12; 0x0014 => 0x14,
case '\u0013': return 0x13; 0x0015 => 0x15,
case '\u0014': return 0x14; 0x0016 => 0x16,
case '\u0015': return 0x15; 0x0017 => 0x17,
case '\u0016': return 0x16; 0x0018 => 0x18,
case '\u0017': return 0x17; 0x0019 => 0x19,
case '\u0018': return 0x18; 0x001A => 0x1A,
case '\u0019': return 0x19; 0x001B => 0x1B,
case '\u001A': return 0x1A; 0x001C => 0x1C,
case '\u001B': return 0x1B; 0x001D => 0x1D,
case '\u001C': return 0x1C; 0x001E => 0x1E,
case '\u001D': return 0x1D; 0x001F => 0x1F,
case '\u001E': return 0x1E; 0x0020 => 0x20,
case '\u001F': return 0x1F; 0x0021 => 0x21,
case '\u0020': return 0x20; 0x0022 => 0x22,
case '\u0021': return 0x21; 0x0023 => 0x23,
case '\u0022': return 0x22; 0x0024 => 0x24,
case '\u0023': return 0x23; 0x0025 => 0x25,
case '\u0024': return 0x24; 0x0026 => 0x26,
case '\u0025': return 0x25; 0x0027 => 0x27,
case '\u0026': return 0x26; 0x0028 => 0x28,
case '\u0027': return 0x27; 0x0029 => 0x29,
case '\u0028': return 0x28; 0x002A => 0x2A,
case '\u0029': return 0x29; 0x002B => 0x2B,
case '\u002A': return 0x2A; 0x002C => 0x2C,
case '\u002B': return 0x2B; 0x002D => 0x2D,
case '\u002C': return 0x2C; 0x002E => 0x2E,
case '\u002D': return 0x2D; 0x002F => 0x2F,
case '\u002E': return 0x2E; 0x0030 => 0x30,
case '\u002F': return 0x2F; 0x0031 => 0x31,
case '\u0030': return 0x30; 0x0032 => 0x32,
case '\u0031': return 0x31; 0x0033 => 0x33,
case '\u0032': return 0x32; 0x0034 => 0x34,
case '\u0033': return 0x33; 0x0035 => 0x35,
case '\u0034': return 0x34; 0x0036 => 0x36,
case '\u0035': return 0x35; 0x0037 => 0x37,
case '\u0036': return 0x36; 0x0038 => 0x38,
case '\u0037': return 0x37; 0x0039 => 0x39,
case '\u0038': return 0x38; 0x003A => 0x3A,
case '\u0039': return 0x39; 0x003B => 0x3B,
case '\u003A': return 0x3A; 0x003C => 0x3C,
case '\u003B': return 0x3B; 0x003D => 0x3D,
case '\u003C': return 0x3C; 0x003E => 0x3E,
case '\u003D': return 0x3D; 0x003F => 0x3F,
case '\u003E': return 0x3E; 0x0040 => 0x40,
case '\u003F': return 0x3F; 0x0041 => 0x41,
case '\u0040': return 0x40; 0x0042 => 0x42,
case '\u0041': return 0x41; 0x0043 => 0x43,
case '\u0042': return 0x42; 0x0044 => 0x44,
case '\u0043': return 0x43; 0x0045 => 0x45,
case '\u0044': return 0x44; 0x0046 => 0x46,
case '\u0045': return 0x45; 0x0047 => 0x47,
case '\u0046': return 0x46; 0x0048 => 0x48,
case '\u0047': return 0x47; 0x0049 => 0x49,
case '\u0048': return 0x48; 0x004A => 0x4A,
case '\u0049': return 0x49; 0x004B => 0x4B,
case '\u004A': return 0x4A; 0x004C => 0x4C,
case '\u004B': return 0x4B; 0x004D => 0x4D,
case '\u004C': return 0x4C; 0x004E => 0x4E,
case '\u004D': return 0x4D; 0x004F => 0x4F,
case '\u004E': return 0x4E; 0x0050 => 0x50,
case '\u004F': return 0x4F; 0x0051 => 0x51,
case '\u0050': return 0x50; 0x0052 => 0x52,
case '\u0051': return 0x51; 0x0053 => 0x53,
case '\u0052': return 0x52; 0x0054 => 0x54,
case '\u0053': return 0x53; 0x0055 => 0x55,
case '\u0054': return 0x54; 0x0056 => 0x56,
case '\u0055': return 0x55; 0x0057 => 0x57,
case '\u0056': return 0x56; 0x0058 => 0x58,
case '\u0057': return 0x57; 0x0059 => 0x59,
case '\u0058': return 0x58; 0x005A => 0x5A,
case '\u0059': return 0x59; 0x005B => 0x5B,
case '\u005A': return 0x5A; 0x00A3 => 0x5C,
case '\u005B': return 0x5B; 0x005D => 0x5D,
case '\u00A3': return 0x5C; 0x005E => 0x5E,
case '\u005D': return 0x5D; 0x005F => 0x5F,
case '\u005E': return 0x5E; 0x0060 => 0x60,
case '\u005F': return 0x5F; 0x0061 => 0x61,
case '\u0060': return 0x60; 0x0062 => 0x62,
case '\u0061': return 0x61; 0x0063 => 0x63,
case '\u0062': return 0x62; 0x0064 => 0x64,
case '\u0063': return 0x63; 0x0065 => 0x65,
case '\u0064': return 0x64; 0x0066 => 0x66,
case '\u0065': return 0x65; 0x0067 => 0x67,
case '\u0066': return 0x66; 0x0068 => 0x68,
case '\u0067': return 0x67; 0x0069 => 0x69,
case '\u0068': return 0x68; 0x006A => 0x6A,
case '\u0069': return 0x69; 0x006B => 0x6B,
case '\u006A': return 0x6A; 0x006C => 0x6C,
case '\u006B': return 0x6B; 0x006D => 0x6D,
case '\u006C': return 0x6C; 0x006E => 0x6E,
case '\u006D': return 0x6D; 0x006F => 0x6F,
case '\u006E': return 0x6E; 0x0070 => 0x70,
case '\u006F': return 0x6F; 0x0071 => 0x71,
case '\u0070': return 0x70; 0x0072 => 0x72,
case '\u0071': return 0x71; 0x0073 => 0x73,
case '\u0072': return 0x72; 0x0074 => 0x74,
case '\u0073': return 0x73; 0x0075 => 0x75,
case '\u0074': return 0x74; 0x0076 => 0x76,
case '\u0075': return 0x75; 0x0077 => 0x77,
case '\u0076': return 0x76; 0x0078 => 0x78,
case '\u0077': return 0x77; 0x0079 => 0x79,
case '\u0078': return 0x78; 0x007A => 0x7A,
case '\u0079': return 0x79; 0x007B => 0x7B,
case '\u007A': return 0x7A; 0x007C => 0x7C,
case '\u007B': return 0x7B; 0x007D => 0x7D,
case '\u007C': return 0x7C; 0x007E => 0x7E,
case '\u007D': return 0x7D; 0x007F => 0x7F,
case '\u007E': return 0x7E; 0x2588 => 0xA0,
case '\u007F': return 0x7F; 0xF8FF => 0xC0,
case '\u2588': return 0xA0; 0x1FBB0 => 0xC2,
case '\u231B': return 0xC3; 0x231B => 0xC3,
case '\u2713': return 0xC4; 0x2713 => 0xC4,
case '\u2190': return 0xC8; 0x1FBB1 => 0xC5,
case '\u2026': return 0xC9; 0x1FBB2 => 0xC6,
case '\u2193': return 0xCA; 0x1FBB3 => 0xC7,
case '\u2191': return 0xCB; 0x2190 => 0xC8,
case '\u21B5': return 0xCD; 0x2026 => 0xC9,
case '\u2192': return 0xD5; 0x2193 => 0xCA,
case '\u25C6': return 0xDB; 0x2191 => 0xCB,
default: 0x1FB76 => 0xCC,
// Fallback to '?' 0x21B5 => 0xCD,
return 0x3F; 0x2589 => 0xCE,
} 0x1FBB5 => 0xCF,
} 0x1FBB6 => 0xD0,
0x1FBB7 => 0xD1,
0x1FBB8 => 0xD2,
0x2500 => 0xD3,
0x1FB7C => 0xD4,
0x2192 => 0xD5,
0x2592 => 0xD6,
0x1FB90 => 0xD7,
0x1FBB9 => 0xD8,
0x1FBBA => 0xD9,
0x2595 => 0xDA,
0x25C6 => 0xDB,
0x1FB80 => 0xDC,
0x1FBBB => 0xDD,
0x1FBBC => 0xDE,
0x258F => 0xDF,
_ => 0x3F
};
} }
} }