문제

ASCII에서 EBCDIC으로 전환하려면 '간단한'유틸리티를 작성해야합니까?

ASCII는 Java, 웹에서 나와 AS400으로갑니다. 나는 Google 주변을 가지고 있었고 쉬운 솔루션을 찾을 수없는 것 같다 (아마도 하나는 없을 것이다 :(). 나는 이미 쓰여진 OpenSource Util 또는 Util에 대한 지불을 기대하고 있었다.

이렇게?

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

감사,

스콧

도움이 되었습니까?

해결책

jtopen, IBM의 오픈 소스 버전의 Java Toolbox에는 Filereader 및 Filewriter를 포함하여 AS/400 개체에 액세스 할 수있는 클래스 모음이 있습니다. 이는 사용하기가 더 쉬울 수 있으며 자신의 전환 수업을 작성합니다.

jtopen 홈페이지에서 :

다음은 Jtopen을 사용하여 액세스 할 수있는 많은 i5/OS 및 OS/400 리소스 중 일부입니다.

  • 데이터베이스 -JDBC (SQL) 및 레코드 수준 액세스 (DDM)
  • 통합 파일 시스템
  • 프로그램 호출
  • 명령
  • 데이터 큐
  • 데이터 영역
  • 인쇄/스풀 리소스
  • 제품 및 PTF 정보
  • 작업 및 작업 기록
  • 메시지, 메시지 대기열, 메시지 파일
  • 사용자 및 그룹
  • 사용자 공간
  • 시스템 값
  • 시스템 상태

다른 팁

Java의 문자열은 Java의 기본 인코딩에서 텍스트를 보유하고 있습니다. ASCII 또는 eBCDIC "String"을 메모리에 잡고 문자열로 인코딩하기 전에 바이트 []로 제공됩니다.

ASCII -> Java:   new String(bytes, "ASCII")
EBCDIC -> Java:  new String(bytes, "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(byte[] bytes, [int offset, int length,] String enc)

이것으로 하나를 만들 수 있습니다 번역 테이블.

하지만 여기 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 문자 세트에 대해서는 간단해야하며, 각각의 문자 표현을 반환합니다. 그런 다음 문자열 위로 고리서 번역 한 다음 맵에서 각 문자를 찾아 출력 문자열에 추가하십시오.

컨버터가 공개적으로 제공되는지는 모르겠지만, 한 시간 이상 걸리지 않아야합니다.

이것이 제가 사용했던 것입니다.

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 기능 (내 인스턴스에서 데이터 queue에 쓰기)을 엄격히 사용하지 않았습니다. 자동 마그네틱 우리가 여러 API를 통해 의사 소통을하고 있기 때문에 인코딩은 귀하에게 적용되지 않았습니다.

내 문제는 특정 문자가 매핑하지 않는 @scottyab의 문제와 유사했습니다. 제 경우에는 참조 된 예제 코드가 완벽하게 작동했지만 XML 문자열을 데이터 큐에 작성하면 [£로 대체되었습니다.

수십 년의 정보가 포함 된 기존 데이터베이스 백엔드로 작업하는 웹 개발자로서 나는 단순히 "오해"를 "오른쪽"할 수있는 능력이 없었습니다. 다른 의견 제시자가 제안한 것처럼.

그러나 알려진 좋은 파일에 파일 필드 정보를 표시하기 위해 400에 명령을 발행하여 사용했을 가능성이있는 코딩 된 문자 세트 식별자를 볼 수있었습니다. DSPFFD *LIB*/*FILE*.

그렇게하면 특정 CCSID 세트를 포함하여 좋은 정보를 제공했습니다.CCSID Identifier

일부 후 CCSID에 대한 정보, 나는 IBM의 한 페이지를 만났다 EBCDIC 페이지에 주요 정보가 인쇄되어 있습니다 (사라지는 습관이 있기 때문에) :

버전 11.0.

그리고 가장 도움이됩니다.

일부 예 EBCDIC CCSID는 37, 500 및 1047입니다.

내가 이미 이 질문 자체에서 배웠습니다 저것 Cp1047 시도해 볼 또 다른 좋은 캐릭터입니다 (이번에는 £가 악센트 "Y"로 바뀌 었습니다), 나는 시도했습니다. Cp37 그러한 charsset이 존재하지 않기 위해 그러나 시도했다 Cp037 그리고 올바른 인코딩을 얻었습니다.

키가 어느 것을 찾는 것 같아요 코딩 된 문자 세트 식별자 (CCSID) 시스템에서 사용되며 JT400 인스턴스 (그렇지 않으면 완벽하게 작동하는지 확인)가 AS400의 인코딩 세트와 100% 일치하는지 확인합니다. 방법 평생과 수십 년 전의 비즈니스 논리 전에.

Kwebble과 Shawn S가 말한 것에 추가하고 싶습니다. jtopen을 사용하여 이것을 할 수 있습니다.

나는 60p (6 바이트, 소수점 뒤에는 아무것도 포장되지 않은 필드에 글을 써야했다). 그것은 DDM을 맥주하지 않는 사람들에게는 10 진수 (11,0)입니다.

    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을 사용했습니다. Shawn이 언급 한 것처럼 DSPPFD를 살펴보면 테이블이 CCSID 37을 사용하고 있음을 발견했습니다.

나는 원래 Alan Krueger의 제안에 따라 CP1047을 사용해 보았습니다. 작동하는 것 같았습니다. 불행히도, 내 custid가 5로 끝나면 파일로 렌더링 된 데이터는 5f 대신 B0입니다. CP037로 변경하면 고정되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top