Преобразовать строку из ASCII в EBCDIC в Java?
Мне нужно написать "простой" способ конвертировать из ASCII в EBCDIC?
Ascii поставляется с Java, Web и переходит на AS400. У меня был google вокруг, похоже, не может найти легкое решение (может быть, coz нет никого:(). Я надеялся на использование openource или заплатил за использование, которое уже было написано.
Как это может быть?
Converter.convertToAscii(String textFromAS400)
Converter.convertToEBCDIC(String textFromJava)
Спасибо,
Скотт
Ответы
Ответ 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 исправлено.