O que codepage / charset deve ser usado para interpretar dados provenientes de um sistema MVS em um ambiente Java?

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

Pergunta

Eu vim para um problema interessante (como é frequentemente o caso em interagir com sistemas legados). Eu estou trabalhando em um aplicativo (que atualmente é executado em um sistema x86 Linux ou Windows) que pode receber pedidos a partir de uma variedade de sistemas, sendo um deles um sistema MVS.

Eu estou tentando determinar qual página de código / charset eu deveria estar usando para interpretar solicitação de dados provenientes do sistema MVS.

No passado, eu usei 'CP500' (IBM-500) para interpretar data byte vindo para sistemas z / OS, porém temo que desde MVS é um pouco de um sistema legado, e que desde IBM parecia mudá-lo da mente de forma consistente a respeito do que a codificação para uso (deve haver dezenas de codificações EBCDIC), que CP500 pode não ser a codificação correta.

O melhor recurso que eu encontrei em conjuntos de caracteres em Java é: http://mindprod.com/jgloss / que codifica . No entanto a partir deste site, e IBM Infocentros, eu não tenho sido capaz de obter uma resposta clara.

EDIT: Adicionado de minha resposta a Pax abaixo:

Havia um buraco olhando na minha pergunta na origem dos dados do pedido. Neste caso, a origem dos dados é através de uma interface Websphere MQ. Websphere MQ tem instalações para traduzir para a codificação adequada, no entanto, que é apenas para a leitura dos dados usando MQMessage.readString (), que desde então tem sido substituído. Eu preferiria usar isso, mas estou usando um quadro interface proprietária em que eu não posso mudar a forma como a mensagem é lida fora do MQQueue, que está a ler bytes diretamente fora da fila e, assim, estou tradução punho esquerdo.

Resposta final: eu queria acompanhar esta. Acontece que o caractere correto Set era de fato CP500 (IBM-500). No entanto, eu estou sob a impressão de que os resultados podem variar. Algumas dicas para qualquer outra pessoa com o mesmo problema:

Utiliza Charset.availableCharsets () ;. Isto lhe dará um mapa de conjuntos de caracteres suportados em seu tempo de execução. I iterado através destes conjuntos e impressos meus dados byte traduzidos em que conjunto de caracteres. Enquanto ele não me deu a resposta que eu queria (principalmente porque eu não era capaz de ler os dados, uma vez que estava entrando), eu imagino que poderia ser útil para os outros.

Consulte: http://mindprod.com/jgloss/encoding para uma lista de suportada conjuntos de caracteres.

Por último, embora eu ainda não confirmou isso, mas garantir que você está usando o JRE direita. Estou pensando que o suporte IBM Runtimes mais EBCDIC conjuntos de caracteres, em seguida, OpenJDK ou tempos de execução da Sun.

Foi útil?

Solução

"MVS é um pouco de um sistema legado"? Ha! Ainda é o sistema operacional de escolha para aplicações onde a confiabilidade é a preocupação número um. Agora sobre a sua pergunta: -)

Isso depende inteiramente do que está gerando os dados. Por exemplo, se você está apenas o download de arquivos a partir do host, a negociação FTP pode lidar com isso. Mas desde que você menciona Java, é provavelmente a conexão via JDBC para DB2 / z, e os drivers JDBC vai lidar com isso muito bem (muito melhor se você estiver usando o próprio JRE da IBM em vez da versão Sun).

si EBCDIC no host tem algumas codificações diferentes de modo que você precisa, pelo menos, deixe-nos saber onde os dados são provenientes. As versões recentes do DB2 tem nenhum problema com o armazenamento de Unicode no banco de dados que iria aliviar todas as suas preocupações.

A primeira tarefa, descobrir onde os dados estão vindo e começar a codificação do seu SYSPROG (se não for tratada automaticamente).

Update:

Andrew, com base no seu texto adicionado onde você indicar que você não pode usar as traduções fornecidas, você vai ter que usar o método manual. Você precisa identificar a fonte dos dados e obter o CCSID do que isso. Em seguida, faça a tradução de e para Unicode (ou qualquer página de código que você está usando, se não Unicode) manualmente.

CCSID 500 é a página de código padrão para EBCDIC International (não euro), mas estas máquinas são utilizadas em todo o planeta. z / OS serviços de conversão é a forma como você costuma fazer a conversão no mainframe.

este é uma página iSeries, ele lista um número enorme de CCSIDs e seus glifos, aplicável ao mainframe também.

Você provavelmente só precisa descobrir se você está usando CCSID 500 ou 37 (ou uma das versões em língua estrangeira) e trabalhar o mapeamento com Unicode CCSID 1208. Seu SYSPROG será capaz de dizer qual. Se você está trabalhando para uma empresa dos EUA, ele provavelmente 500 ou 37, mas a IBM gasta uma grande quantidade de esforço apoiando várias páginas de código. Vou ficar feliz quando todas as suas lojas de software de mainframe e usa Unicode por padrão, ele vai tornar as coisas muito mais fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top