質問

私は書く必要がある、"シンプル"util変換からASCIIへのEBCDIC?

のアスキーから、JavaのウェブをAS400.またgoogleは、なべやすいソリューション(かもフランス語が堪能な方、是非ありません。().ったことを期待してopensource utilまたは支払utilて書かれています。

このようにいってちょっと違うな。

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

おかげさ

スコット

役に立ちましたか?

解決

JTOpen, アイ-ビー-エム株式会社のオープンソースのバージョンをリリースJavaツールボックスコレクションのクラスアクセスAS/400物を含め、FileReader、FileWriterへのアクセスネイティブAS400テキストファイルです。ることがより使いやすくして書面に独自の変換。

からJTOpenホームページ:

ここでは、多くのi5/OS、OS/400資源にアクセスでき用JTOpen:

  • データベース--JDBC SQLを記録レベルのアクセス(DDM)
  • 総合ファイルシステム
  • プログラムと呼
  • コマンド
  • データキュー
  • データ領域
  • 印刷スプールの資源
  • 製品およびPTF情報
  • 雇用と職業履歴
  • メッセージ、メッセージキュー、メッセージファイル
  • ユーザーとグループ
  • ユーザ空間
  • 価値システム
  • システムの状況

他のヒント

のJavaのStringは、Javaのネイティブエンコーディングのテキストを保持していることに注意してください。 、メモリ内のASCIIまたはEBCDIC「文字列」を保持する文字列として符号化する前にすると、あなたはバイトで、それを持っています[]。

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コンストラクタを使用します。String(byte[] bytes, [int offset, int length,] String enc)

あなたはこの変換テーブルにして1 yoursefを作成することができます。

しかし、ここの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);
    }
}

ASCII文字セットのEBCDIC文字セットのマップ、および1を書くことはかなり簡単なもので、それぞれに他の文字表現を返す必要があります。そして、文字列の上にちょうどループ変換し、マップ内の各文字を検索し、出力文字列にそれを追加する。

すべてのコンバータの公に利用可能があるかどうかはわからないが、それはものを書くために時間かそこら以上を服用してはいけません。

これは私が使用してきたものです。

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特集(書Dataqueue、私のインスタンス)で、 自動車-魔法の エンコードなお客さまに適用さしいコミュニケーションを複数のApiを用意しています。

私の問題と同@scottyab号一定のない文字マッピングしました。私の場合、コード例は、私が参照で完璧に動作し、文書をxml文字列をdataqueueた[のに交換され£.

ウェブ-デベロッパーとして働くと、既存のデータベースバックエンドしてきた数十年にわたる情報 なかっただけの"右"の"mis-構成" 一つとしてその他の質問と理解することが可能である。

しかし、私は見ることができるコード化文字セットの識別子にしたがを発行するコマンドに400表示ファイルのフィールドの情報を知ら良いファイル: DSPFFD *LIB*/*FILE*.

うにしてくれた良い情報を含む特定のCCSIDセット:CCSID Identifier

その後 情報を求めるCCSIDs, またページIBMのための EBCDIC キー情報を印刷のページに来ることを習慣にすると消える):

版11.0.0のアップデート版の延長のバイナリコードDecimalインターコード(EBCDIC) はエンコーディング方式が一般的に使用されるzSeries(z/OS®) ータを取り込みシステムかいていたからなんでしょうね。

とラウザーの検索エンジン:

一部の例EBCDIC CCSIDsは37,500 1047.

てって からこの問題自体 その Cp1047 でも文字セットし(この時期のポンドとなったアクセント"Y")う Cp37 見なcharsset存在しており、 もう Cp037 から右側のエンコーディングです。

というのを見ている コード化文字セットの識別子(CCSID) 使用システムが正確ではないことにごjt400インスタンスを組み合は抗-試合で最大100%のエンコーディングセットのas400、私の場合 方法 前の寿命は、長年のビジネスロジック。

私はKwebbleとショーン・Sが言ったことにに追加したいです。私はこれを行うにはJTOpenを使用することができます。

私は6 0P(6バイト、小数点の後ろに何も、パック)であったフィールドに書き込むために必要。これは、DDMを完全に理解していないあなたの人々のための小数(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が言及したライブラリを使用していました。ショーン・Sが述べたようにDSPPFDを見て、私はテーブルこれは働いていたCCSID 37を使用していたことを発見します。

私はもともとアラン・クルーガーの提案に従って、Cp1047を使用してみました。動作するように見えました。私CUSTIDは5で終わった場合は残念ながら、ファイルにレンダリングされたデータは、B0の代わり5Fました。 Cp037にそれを変更するには、それを固定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top