Подтвердить что ты не робот

Преобразовать строку из ASCII в EBCDIC в Java?

Мне нужно написать "простой" способ конвертировать из ASCII в EBCDIC?

Ascii поставляется с Java, Web и переходит на AS400. У меня был google вокруг, похоже, не может найти легкое решение (может быть, coz нет никого:(). Я надеялся на использование openource или заплатил за использование, которое уже было написано.

Как это может быть?

Converter.convertToAscii(String textFromAS400)
Converter.convertToEBCDIC(String textFromJava)

Спасибо,

Скотт

4b9b3361

Ответ 1

JTOpen, IBM с открытым исходным кодом своего инструментария Java имеет набор классов для доступа к объектам AS/400, включая FileReader и FileWriter, чтобы доступ к родным текстовым файлам AS400. Это может быть проще использовать, чем писать собственные классы преобразования.

На домашней странице JTOpen:

Вот лишь некоторые из многих ресурсов i5/OS и OS/400, с которыми вы можете получить доступ, используя JTOpen:

  • База данных - JDBC (SQL) и доступ на уровне записи (DDM)
  • Интегрированная файловая система
  • Программные вызовы
  • Команды
  • очереди данных
  • Области данных
  • Ресурсы печати /spool
  • Информация о продукте и PTF
  • Задания и журналы работы
  • Сообщения, очереди сообщений, файлы сообщений
  • Пользователи и группы
  • Пользовательские пространства
  • Системные значения
  • Состояние системы

Ответ 2

Обратите внимание, что строка в Java содержит текст в исходной кодировке Java. При сохранении ASCII или EBCDIC "строки" в памяти перед кодировкой в ​​виде строки вы будете иметь ее в байте [].

ASCII -> Java:   new String(bytes, "ASCII")
EBCDIC -> Java:  new String(bytes, "Cp1047")
Java -> ASCII:   string.getBytes("ASCII")
Java -> EBCDIC:  string.getBytes("Cp1047")

Ответ 3

package javaapplication1;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;

import java.nio.charset.CharacterCodingException;

import java.nio.charset.Charset;

import java.nio.charset.CharsetDecoder;

import java.nio.charset.CharsetEncoder;

public class ConvertBetweenCharacterSetEncodingsWithCharBuffer {

    public static void main(String[] args) {

       //String cadena = "@@@@@@@@@@@@@@@ñâæÃÈÄóöó@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÔÁâãÅÙÃÁÙÄ@ÄÅÂÉã@âæÉãÃÈ@@@@@@@@";
        String cadena = "ñâæÃÈÄóöó";
        System.out.println(Convert(cadena,"CP1047","ISO-8859-1"));
        cadena = "1SWCHD363";
        System.out.println(Convert(cadena,"ISO-8859-1","CP1047"));

    }

    public static String Convert (String strToConvert,String in, String out){
       try {

        Charset charset_in = Charset.forName(out);
        Charset charset_out = Charset.forName(in);

        CharsetDecoder decoder = charset_out.newDecoder();

        CharsetEncoder encoder = charset_in.newEncoder();

        CharBuffer uCharBuffer = CharBuffer.wrap(strToConvert);

        ByteBuffer bbuf = encoder.encode(uCharBuffer);

        CharBuffer cbuf = decoder.decode(bbuf);

        String s = cbuf.toString();

        //System.out.println("Original String is: " + s);
        return s;

    } catch (CharacterCodingException e) {

        //System.out.println("Character Coding Error: " + e.getMessage());
        return "";

    }


}

}

Ответ 4

Вы должны использовать либо набор символов Java Cp1047 (Java 5), ​​либо Cp500 (JDK 1.3 +).

Используйте конструктор String: String(byte[] bytes, [int offset, int length,] String enc)

Ответ 5

Вы можете создать onesesef с помощью этой таблицы переводов.

Но здесь - это сайт, на котором есть ссылка на пример Java.

Ответ 6

Достаточно просто написать карту для набора символов EBCDIC и одну для набора символов ASCII, а в каждом возвращать представление символа другого. Затем просто перебирайте строку для перевода и просматривайте каждый символ на карте и добавляйте ее к выходной строке.

Я не знаю, доступен ли какой-либо конвертер общедоступным, но для его написания не требуется больше часа.

Ответ 7

Это то, что я использовал.

public static final int[] ebc2asc = new int[256];
public static final int[] asc2ebc = new int[256];

static
{
  byte[] values = new byte[256];
  for (int i = 0; i < 256; i++)
    values[i] = (byte) i;

  try
  {
    String s = new String (values, "CP1047");
    char[] chars = s.toCharArray ();
    for (int i = 0; i < 256; i++)
    {
      int val = chars[i];
      ebc2asc[i] = val;
      asc2ebc[val] = i;
    }
  }
  catch (UnsupportedEncodingException e)
  {
    e.printStackTrace ();
  }
}

Ответ 8

Возможно, как и я, вы строго не использовали функцию JDBC (на мой взгляд, записывать в Dataqueue), поэтому автомагиясильная кодировка не применима к вам, поскольку мы общаемся с несколькими API-интерфейсами.

Моя проблема была похожа на проблему @scottyab с некоторыми символами, не отображающими. В моем случае код примера, на который я ссылался, работал отлично, но запись строки xml в dataqueue привела к тому, что [заменяется на £.

Как веб-разработчик, работающий с уже существующей базой данных базы данных с десятилетиями информации, Я не просто имел возможность "правильно" "неправильно сконфигурировать" , как предлагает другой комментатор.

Тем не менее, я смог увидеть, какой идентификатор кодированного набора символов я, вероятно, использовал, выдав команду 400 для отображения информации о файле поля в известном хорошем файле: DSPFFD *LIB*/*FILE*.

Это дало мне хорошую информацию, включая специальный набор CCSID: Идентификатор CCSID

После некоторой информации, запрашиваемой по CCSIDs, я столкнулся с страницей IBM для EBCDIC с ключевой информацией, напечатанной на странице (так как это имеет привычку исчезать):

Версия 11.0.0 Расширенный двоично-кодированный код децимального обмена (EBCDIC) представляет собой схему кодирования, которая обычно используется в zSeries (z/OS®) и iSeries (System i®).

И самое полезное:

В некоторых примерах CCCDID EBCDIC - 37, 500 и 1047.

Поскольку я уже узнал из этого самого вопроса, что Cp1047 - еще один хороший набор символов, чтобы попробовать (на этот раз £ превратился в акцентированный "Y" ), Я пробовал Cp37 видеть, что такой charsset не существует, , но попытался Cp037 и получил правильную кодировку.

Похоже, что ключ обнаруживает, что в вашей системе используется Идентификатор набора символов (CCSID), и убедитесь, что ваш экземпляр jt400, который в противном случае работает над улучшением, соответствует 100% кодировка, установленная на as400, в моем случае до моей жизни и десятилетия бизнес-логики назад.

Ответ 9

Я делаю код, который легко преобразует типы данных.

public class Converter{

    public static void main(String[] args) {

        Charset charsetEBCDIC = Charset.forName("CP037");
        Charset charsetACSII = Charset.forName("US-ASCII");

        String ebcdic = "(((((((";
        System.out.println("String EBCDIC: " + ebcdic);
        System.out.println("String converted to ASCII: " + convertTO(ebcdic, charsetEBCDIC, charsetACSII));

        String ascII = "MMMMMM";
        System.out.println("String ASCII: " + ascII);
        System.out.println("String converted to EBCDIC: " + convertTO(ascII, charsetACSII, charsetEBCDIC));
    }

    public static String convertTO(String dados, Charset encondingFrom, Charset encondingTo) {
        return new String(dados.getBytes(encondingFrom), encondingTo);
    }
}

Ответ 10

Я хочу добавить к тому, что сказал Kwebble и Shawn S. Я могу использовать JTOpen для этого.

Мне нужно было написать поле, которое было 6 0P (6 байтов, ничего позади десятичного, упакованное). Это десятичная (11,0) для тех из вас, кто не грохнет DDM.

    AS400PackedDecimal convertedCustId = new AS400PackedDecimal(11, 0);
    byte[] packedCust = convertedCustId.toBytes((int) custId);

    String packedCustStr = new String(packedCust, "Cp037");

    StringBuilder jcommData = new StringBuilder();
    jcommData.append(String.format("%6s", packedCustStr));

Да, я использовал упомянутую библиотеку KWebble. Глядя на DSPPFD, как упоминал Шон S, я обнаружил, что в таблице используется CCSID 37. Это сработало.

Первоначально я пытался использовать Cp1047, согласно предложению Алана Крюгера. Казалось, это сработало. К сожалению, если мой custId закончил с 5, данные, переданные в файл, были B0 вместо 5F. Изменение его на Cp037 исправлено.