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

Имам два масива, използвани за конвертиране от ASCII в EBCDIC и обратно. Контекстът е: има MyMainframeApp, работещ в UNIX и изпраща/получава само файлове в EBCDIC. Такива файлове трябва да бъдат прочетени от MyWebApp във формат ASCII, обработени и върнати в EBCDIC. Следващите два масива отговарят перфектно на преобразуването. Проблемът е, че сега трябва да поддържам Extended ASCII (вижте последния масив, който получих от интернет), така че искам да присъединя EXTENDED_Array към ASCII []. Какви биха били еквивалентните кодове в EBCDIC? Приложението трябва да работи под Windows 2012/JDK 6 и Unix/JDK 6 еднакво. Има ли безопасен начин да направя това, ако не знам кода на страницата? Забележка: Не питам как да преобразувам от ASCII в EBCDIC (в този форум има добри отговори на този въпрос). Първо, бих искал да поставя на спот светлина "EXTENDED", след което питам какъв е еквивалентният масив за Extended 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

private final 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

    };

private final 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
Осъзнавате ли, че има няколко EBDIC набора знаци, които вече са вградени в JDKS?   -  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, правя определена логика или ако е def, правя друг поток. Какво точно имате предвид под подушване, за да познаете кодовата страница? Можете ли да посочите някакъв пример? Честно казано, използвах този термин за прилагане на 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