2009-05-04 2 views
3

흥미로운 문제가 생겼습니다 (레거시 시스템과 상호 작용할 때 종종 그렇듯이). 현재 MVS 시스템 중 하나 인 다양한 시스템에서 요청을 수신 할 수있는 응용 프로그램 (현재 x86 Linux 또는 Windows 시스템에서 실행되는 응용 프로그램)을 작성하고 있습니다.MVS 시스템에서 Java 환경으로 들어오는 데이터를 해석 할 때 어떤 코드 페이지/문자 세트를 사용해야합니까?

MVS 시스템에서 들어오는 요청 데이터를 해석하는 데 사용해야하는 코드 페이지/문자 세트를 결정하려고합니다.

이전에는 z/OS 시스템에서 사용할 바이트 날짜를 해석하기 위해 'cp500'(IBM-500)을 사용했지만 MVS는 약간의 레거시 시스템이므로 IBM이 (어떤 수의 EBCDIC 인코딩이 있어야합니다.) cp500이 올바른 인코딩이 아닐 수도 있습니다.

Java에서 문자 집합에 대해 가장 잘 알고있는 자료는 http://mindprod.com/jgloss/encoding입니다. 그러나이 사이트와 IBM Infocenters에서 나는 명확한 답을 얻을 수 없었습니다.

편집 : 아래 팍스 내 응답에서 추가는 :

는 요청 데이터의 기원에 내 질문에 눈부신 구멍이 있었다. 이 경우, 데이터의 출처는 Websphere MQ 인터페이스를 통해 이루어집니다. Websphere MQ에는 적절한 인코딩으로 변환 할 수있는 기능이 있지만 MQMessage.readString()을 사용하여 데이터를 읽는 기능 만 제공됩니다.이 기능은 향후 제공되지 않을 예정입니다. 그러나 이것을 사용하는 것을 선호합니다. 그러나 메시지를 MQQueue에서 읽는 방법을 변경할 수없는 독점적 인 인터페이스 프레임 워크를 사용하고 있습니다. MQQueue는 큐에서 직접 바이트를 읽음으로써 변환 처리를 맡았습니다.

최종 답변 :이 문제를 후속 조치하고 싶습니다. 올바른 문자 세트는 실제로 cp500 (IBM-500)이었습니다. 그러나 결과가 다를 수 있다는 인상하에 있습니다. 동일한 문제가있는 다른 사용자를위한 도움말 :

Charset.availableCharsets(); 이렇게하면 런타임에 지원되는 문자 집합의 맵을 얻을 수 있습니다. 필자는이 세트를 반복하여 문자 세트로 번역 된 바이트 데이터를 출력했습니다. 그것은 내가 원했던 대답을주지 못했지만 (주로 내가 들어오는 동안 데이터를 읽을 수 없었기 때문에), 다른 사람들에게 도움이 될 수 있다고 상상합니다.

지원되는 문자 집합 목록은 http://mindprod.com/jgloss/encoding을 참조하십시오.

마지막으로, 이것을 확인하지는 않았지만 올바른 JRE를 사용하고 있는지 확인하십시오. 나는 IBM Runtimes가 OpenJDK 또는 Sun의 런타임에서 더 많은 EBCDIC 문자 세트를 지원한다고 생각하고있다.

+0

Andrew, availableCharsets()는 처리 할 수있는 것을 알려주지 만 특정 데이터 집합에 어떤 것을 사용해야하는지 알려주지 않습니다. 아직도 그렇지 않으면 전환이 쓰레기를 반환한다는 것을 알아야합니다. 그러나 IBMs JRE에 대해 옳았습니다. z/OS를위한 추가 기능이 있습니다. – paxdiablo

답변

3

"MVS는 약간의 레거시 시스템입니다"? 하아! 신뢰성이 최고의 관심사 인 애플리케이션을 위해 여전히 선택의 여지가있는 OS입니다. 지금 귀하의 질문에 :-)

그것은 전적으로 데이터를 생성하는 것에 달려 있습니다. 예를 들어 호스트에서 파일을 다운로드하는 경우 FTP 협상이이를 처리 할 수 ​​있습니다. 그러나 Java에 대해 언급 했으므로 아마도 JDBC를 통해 DB2/z에 연결하고 있으며 JDBC 드라이버는이를 잘 처리합니다 (Sun 버전이 아닌 IBM 자체 JRE를 사용하는 경우 훨씬 낫습니다).

호스트의 EBCDIC 자체에는 꽤 다른 인코딩이 있으므로 데이터가 어디서 왔는지 알려줄 필요가 있습니다. 최근 DB2 버전은 유니 코드를 데이터베이스에 저장하는 데 아무런 문제가 없으므로 사용자의 모든 걱정을 덜어줍니다.

첫 번째 작업은 데이터가 어디에서 왔는지 확인하고 SysProg에서 인코딩을 가져옵니다 (자동으로 처리되지 않는 경우).

업데이트 :

앤드류, 당신이 머무르는 텍스트를 기반으로 당신이 제공하는 번역을 사용할 수없는 상태, 당신은 수동 방법을 사용해야 할 것입니다. 데이터 소스를 식별하고이를 CCSID로 가져와야합니다. 그런 다음 유니 코드 (또는 유니 코드가 아닌 다른 코드 페이지)를 수동으로 변환합니다.

CCSID 500은 EBCDIC International (유로 제외)의 기본 코드 페이지이지만이 기계는 지구 전역에서 사용됩니다. z/OS 변환 서비스는 대개 메인 프레임에서 변환을 수행하는 방법입니다.

this은 iSeries 페이지이지만 메인 프레임에도 적용 할 수있는 많은 수의 CCSID와 글리프를 나열합니다.

CCSID 500 또는 37 (또는 외국어 버전 중 하나)을 사용하고 있는지 여부를 알아 내고 유니 코드 CCSID 1208로 매핑을 해결하면됩니다. SysProg에서 어느 것을 말할 수 있습니다. 미국 기업에서 근무하는 경우 일 가능성이 있으며 500 또는 37이지만 IBM은 여러 코드 페이지를 지원하는 데 많은 노력을 기울이고 있습니다. 모든 메인 프레임 소프트웨어가 기본적으로 유니 코드를 저장하고 사용할 때 나는 기쁠 것입니다.

+0

Pax, CCSID 500 (IBM-500, cp500)이 올바른 코드 페이지 였으므로 귀하의 지원에 다시 한 번 감사드립니다. – user100645

관련 문제