как конвертировать из расширенного ASCII в EBCDIC и наоборот, когда код страницы неизвестен

У меня есть два массива, которые используются для преобразования из ASCII в EBCDIC и наоборот. Контекст таков: есть MyMainframeApp, работающий в UNIX, и он отправляет/получает файлы только в EBCDIC. Такие файлы должны считываться из MyWebApp в формате ASCII, обрабатываться и возвращаться в формате EBCDIC. Два следующих массива идеально подходят для преобразования. Проблема в том, что теперь мне нужно поддерживать расширенный ASCII (см. последний массив, который я получил из Интернета), поэтому я хочу присоединить EXTENDED_Array к ASCII[]. Какими будут эквивалентные коды в EBCDIC? Приложение должно работать как в Windows 2012/JDK 6, так и в Unix/JDK 6. Есть ли безопасный способ сделать это, если я не знаю код страницы? Примечание. Я не спрашиваю, как преобразовать ASCII в EBCDIC (на этом форуме есть хорошие ответы на этот вопрос). Во-первых, я хотел бы указать «РАСШИРЕННЫЙ», затем я спрашиваю, каков эквивалентный массив для расширенного ASCII ниже и есть ли безопасный способ работать с ним, когда я не знаю о коде страницы.

ASCII[] = {
                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
   };

EBCDIC[] = {
                0x0040, 0x005a, 0x007f, 0x007b, 0x005b, 0x006c, 0x0050, 0x007d, 0x004d,
                0x005d, 0x005c, 0x004e, 0x006b, 0x0060, 0x004b, 0x0061,
                0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8,
                0x00f9, 0x007a, 0x005e, 0x004c, 0x007e, 0x006e, 0x006f,
                0x007c, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8,
                0x00c9, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6,
                0x00d7, 0x00d8, 0x00d9, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
                0x00e8, 0x00e9, 0x00ad, 0x00e0, 0x00bd, 0x005f, 0x006d,
                0x0079, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088,
                0x0089, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096,
                0x0097, 0x0098, 0x0099, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
                0x00a8, 0x00a9, 0x00c0, 0x006a, 0x00d0, 0x00a1
   };

EXTENDED_Array = { 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 };

//Пример EBCDIC J1644€ [1] [1]1240üРB„aà[1][1] [1]1240üРB„aà[1][1] 890@@0482613 @1644€ € @ [1]

// Я хотел бы добавить сюда решение, которое я использую, и оно работает. Хотя это не 100% ответ на мой вопрос о происхождении, я надеюсь, что это может быть полезно для будущих читателей. Перевод был скопирован с http://www.flounder.com/ebcdictoascii2.htm.

частный финал int EBCDIC[] = {

    0x0000, 0x0001, 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F

    , 0x0010, 0x0011, 0x0012, 0x0013, 0x0015, 0x0016, 0x0018, 0x0019, 0x001C, 0x001D, 0x001E, 0x001F

    , 0x0022, 0x0025, 0x0026, 0x0027, 0x002D, 0x002E, 0x002F

    , 0x0032, 0x0037, 0x003C, 0x003D, 0x003F

    , 0x0040, 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

    , 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F

    , 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F

    , 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF

    , 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF

    , 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF

    , 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF

    , 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF

    , 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE

    };

частный финал int ASCII[] = {

    0x0000, 0x0001, 0x0002, 0x0003, 0x0009, 0x007F, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F

    , 0x0010, 0x0011, 0x0012, 0x0013, 0x000A, 0x000B, 0x0018, 0x0019, 0x001C, 0x001D, 0x001E, 0x001F

    , 0x001C, 0x000A, 0x0017, 0x001B, 0x0005, 0x0006, 0x0007

    , 0x0016, 0x0004, 0x0014, 0x0015, 0x001A

    , 0x0020, 0x00E2, 0x00E4, 0x00E0, 0x00E1, 0x00E3, 0x00E5, 0x00E7, 0x00F0, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C

    , 0x0026, 0x00E9, 0x00EA, 0x00EB, 0x00E8, 0x00ED, 0x00EE, 0x00EF, 0x00EC, 0x00DF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x005E

    , 0x002D, 0x002F, 0x00C2, 0x00C4, 0x00C0, 0x00C1, 0x00C3, 0x00C5, 0x00C7, 0x00D1, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F

    , 0x00F8, 0x00C9, 0x00CA, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x005F, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022

    , 0x00D8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00AB, 0x00BB, 0x00F0, 0x000D, 0x00DE, 0x00B1

    , 0x00B0, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x00AA, 0x00BA, 0x00E6, 0x00B8, 0x00C6, 0x00A4

    , 0x00B5, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x00A1, 0x00BF, 0x00D0, 0x005B, 0x00FE, 0x00AE

    , 0x00AC, 0x00A3, 0x00A5, 0x0095, 0x00A9, 0x00A7, 0x00B6, 0x00BC, 0x00BD, 0x00BE, 0x00DD, 0x00A8, 0x00AF, 0x005D, 0x0092, 0x00D7

    , 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x009B, 0x00F4, 0x00F6, 0x00F2, 0x00F3, 0x00F5

    , 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x00B9, 0x00FB, 0x00FC, 0x00F9, 0x00FA, 0x00FF

    , 0x005C, 0x00F7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x00B2, 0x00D4, 0x00D6, 0x00D2, 0x00D3, 0x00D5

    , 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00B3, 0x00DB, 0x00DC, 0x00D9, 0x00DA

    };

person Jim C    schedule 16.01.2015    source источник
comment
Не большинство -- если не все! -- расширенные коды ASCII просто недоступны в EBCDIC?   -  person Jongware    schedule 17.01.2015
comment
Если вы знаете, как конвертировать из/в ASCII/EBCDIC, почему бы вам не использовать это для создания таблицы поиска?   -  person that other guy    schedule 17.01.2015
comment
Вы понимаете, что в JDKS уже встроено несколько кодировок EBDIC?   -  person user207421    schedule 17.01.2015
comment
Действительно ли существует такая вещь, как расширенный ASCII; вы на самом деле путаете его с какой-то другой кодировкой символов?   -  person Raedwald    schedule 17.01.2015
comment
Во-первых, спасибо вам всем. Я добавил фрагмент EBCDIC, чтобы показать, что я получу со стороны мейнфрейма. Если вы посмотрите выше, вы увидите массив с именем EXTENDED_Array, но я не знаю эквивалента этого массива в EBCDIC. Как я могу обнаружить каждый из них для соответствия в соответствии с его кодовой страницей? Например, предположим, что у меня есть два сервера: один — UTF-8, а другой — ISO-8859. Посмотрите на первый символ из EXTENDED_Array 0x00C7. Что эквивалентно EBDIC в UTF-8 и что эквивалентно в ISO-8859? Как узнать это, чтобы заполнить массив EBDIC[]?   -  person Jim C    schedule 19.01.2015


Ответы (1)


Безопасно, вы не можете, когда кодовая страница неизвестна. Ваш лучший выбор

  1. Пользовательские таблицы преобразования
  2. Нюхаю, чтобы попытаться угадать кодовую страницу
person Tasos Vogiatzoglou    schedule 16.01.2015
comment
Что касается вашего второго комментария, есть ли способ выяснить, какая кодовая страница на сервере из Java? Я имею в виду, что во время выполнения проверьте, что такое кодовая страница, и если это abc, я выполняю определенную логику, или если это определение, я выполняю другой поток. Что именно вы подразумеваете под обнюхиванием, чтобы угадать кодовую страницу? Можете ли вы указать какой-нибудь пример? Честно говоря, я использовал этот термин для обозначения http-коммуникаций, но я полагаю, что вы хотите сказать другое. - person Jim C; 19.01.2015
comment
Неудачный выбор слов. Я думал о том, чтобы прочитать первые несколько байтов содержимого (1024 или что-то в этом роде) и использовать jchardet или что-то подобное, чтобы получить предположение о кодовой странице. - person Tasos Vogiatzoglou; 19.01.2015
comment
Знаете ли вы, безопасно ли использовать jchardet для точного определения кодовой страницы? Я прочитал jchardet.sourceforge.net, и он кажется довольно простым в использовании, но мне интересно, могу ли я положиться на Это. Одно и то же приложение будет работать в Windows 2012 и на мэйнфреймах/Unix, где я не могу это контролировать. - person Jim C; 19.01.2015
comment
Вы никогда не можете быть уверены во внешнем фрагменте кода. Он работает довольно хорошо, но вам придется проверить его на своих данных. Что бы я сделал, так это создал небольшой корпус файлов с известными кодовыми страницами и перепроверил его с помощью того, что вам даст jchardet. Это может дать вам хорошую оценку того, насколько вы можете доверять этому. - person Tasos Vogiatzoglou; 20.01.2015
comment
Я добавил выше решение, которое использую, чтобы оно было полезным для будущих читателей. Спасибо всем! - person Jim C; 20.01.2015
comment
Просто из любопытства, что такое мейнфрейм? - person Tasos Vogiatzoglou; 20.01.2015