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

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

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

Может, так?

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

Благодаря,

Скотт

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

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

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

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

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

 ASCII -> Java: новая строка (байты, «ASCII»)
 EBCDIC -> Java: новая строка (байты, «Cp1047»)
 Java -> ASCII: string.getBytes ("ASCII")
 Java -> EBCDIC: string.getBytes ("Cp1047")
 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 ""; } } } 

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

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

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

Но вот сайт, который имеет ссылку на пример Java.

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

 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); } } 

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

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

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

 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 (); } } 

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

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

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

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

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

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

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

И наиболее полезно:

Некоторым примером CCCDID EBCDIC являются 37, 500 и 1047.

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

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

Я хочу добавить к тому, что сказал 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, он исправил это.

Interesting Posts

Создайте простой обратный отсчет при обработке

Материнская плата Gigabyte (890gpa-ud3h) не отключит питание USB

Удаление нескольких столбцов на основе имен столбцов в Pandas

Двухэтапный поиск – требуется объяснение

OpenCV 2.4.3rc и CUDA 4.2: «Ошибка OpenCV: поддержка GPU не поддерживается»

Есть ли лучшая альтернатива этому, чтобы «включить тип»?

Количество вкладок в Chrome или Firefox

использование ярлыков в java без “петель”

Вызовите функцию внешним приложением, не открывая новый экземпляр Matlab

Как заставить Windows перестать предполагать приоритет над GRUB?

Как добавить пользовательскую вкладку Ribbon с помощью VBA?

ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле classа javax / mail / MessagingException

как реализовать как ontouch, так и onfling в одном списке?

Возвращать пустую ячейку из формулы в Excel

Успешная assembly с множеством ошибок в машинописных файлах с машинописными текстами

Давайте будем гением компьютера.