Java에서 문자열을 ASCII에서 EBCDIC으로 변환 하시겠습니까?
-
21-08-2019 - |
문제
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)
데이터 유형을 쉽게 변환하는 코드를 만듭니다.
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에 대한 정보, 나는 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로 변경하면 고정되었습니다.