Какую кодовую страницу/кодировку следует использовать для интерпретации данных, поступающих из системы MVS, в среду Java?

StackOverflow https://stackoverflow.com/questions/818759

Вопрос

Я столкнулся с интересной проблемой (как это часто бывает при взаимодействии с устаревшими системами).Я работаю над приложением (которое в настоящее время работает в системе x86 Linux или Windows), которое может получать запросы от различных систем, одна из которых является системой MVS.

Я пытаюсь определить, какую кодовую страницу/кодировку мне следует использовать для интерпретации данных запроса, поступающих из системы MVS.

Раньше я использовал «cp500» (IBM-500) для интерпретации байтовой даты, поступающей в системы z/OS, однако боюсь, что, поскольку MVS является своего рода устаревшей системой, и что, поскольку IBM, похоже, передумала последовательно в отношении того, какую кодировку использовать (должны быть десятки кодировок EBCDIC), cp500 может быть неправильной кодировкой.

Лучший ресурс, который я нашел по наборам символов в Java: http://mindprod.com/jgloss/encoding .Однако с этого сайта и из информационных центров IBM мне не удалось получить четкого ответа.

РЕДАКТИРОВАТЬ:Добавлено из моего ответа Паксу ниже:

В моем вопросе была явная дыра в происхождении данных запроса.В этом случае источником данных является интерфейс Websphere MQ.В Websphere MQ есть средства для перевода в правильную кодировку, однако они предназначены только для чтения данных с помощью MQMessage.readString(), который с тех пор устарел.Я бы предпочел использовать это, однако я использую проприетарную структуру интерфейса, в которой я не могу изменить способ чтения сообщения из MQQueue, который считывает байты непосредственно из очереди, и, таким образом, я оставляю перевод левой ручки.

Окончательный ответ:Я хотел продолжить это дело.Оказывается, правильный набор символов действительно был cp500 (IBM-500).Однако у меня сложилось впечатление, что результаты могут отличаться.Несколько советов для тех, кто столкнулся с такой же проблемой:

Используйте Charset.availableCharsets();.Это даст вам карту поддерживаемых наборов символов во время выполнения.Я перебрал эти наборы и распечатал свои байтовые данные, переведенные в этот набор символов.Хотя это не дало мне желаемого ответа (в основном потому, что я не мог читать данные по мере их поступления), я полагаю, что это может быть полезно для других.

Ссылаться на: http://mindprod.com/jgloss/encoding для списка поддерживаемых наборов символов.

Наконец, хотя я и не подтверждал это, убедитесь, что вы используете правильную JRE.Я думаю, что среды выполнения IBM поддерживают больше наборов символов EBCDIC, чем OpenJDK или среды выполнения Sun.

Это было полезно?

Решение

«MVS — это что-то вроде устаревшей системы»?Ха!Это по-прежнему предпочтительная ОС для приложений, где надежность является проблемой номер один.Теперь о вашем вопросе :-)

Это полностью зависит от того, что генерирует данные.Например, если вы просто загружаете файлы с хоста, согласование FTP может справиться с этим.Но поскольку вы упомянули Java, он, вероятно, подключается через JDBC к DB2/z, и драйверы JDBC справятся с этим довольно хорошо (гораздо лучше, если вы используете собственную JRE от IBM, а не версию Sun).

Сам EBCDIC на хосте имеет довольно много разных кодировок, поэтому вам нужно хотя бы сообщить нам, откуда берутся данные.В последних версиях DB2 нет проблем с хранением Unicode в базе данных, что избавит вас от всех ваших забот.

Первая задача: выяснить, откуда берутся данные, и получить кодировку из вашего SysProg (если она не обрабатывается автоматически).

Обновлять:

Эндрю, судя по добавленному вами тексту, в котором вы заявляете, что не можете использовать предоставленные переводы, вам придется использовать ручной метод.Вам необходимо определить источник данных и получить от него CCSID.Затем выполните перевод в Юникод и обратно (или любую другую кодовую страницу, которую вы используете, если не Юникод) вручную.

CCSID 500 — это кодовая страница по умолчанию для EBCDIC International (без евро), но эти машины используются по всей планете.Службы преобразования z/OS — это то, как вы обычно выполняете преобразование на мэйнфрейме.

Хотя этот — это страница iSeries, на ней перечислено огромное количество CCSID и их символов, применимых и к мэйнфреймам.

Вероятно, вам просто нужно выяснить, используете ли вы CCSID 500 или 37 (или одну из версий на иностранном языке), и определить соответствие с Unicode CCSID 1208.Ваш SysProg сможет сказать вам, какой из них.Если вы работаете в американской компании, это вероятно 500 или 37, но IBM тратит много усилий на поддержку нескольких кодовых страниц.Я буду рад, когда все их программное обеспечение для мэйнфреймов будет хранить и использовать Unicode по умолчанию, это значительно упростит задачу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top