ASCIIからEBCDICに変換するには、「シンプルな」ユーティリティを書く必要がありますか?
Asciiは、Java、Web、およびAS400から提供されます。私は周りにグーグルを持っていて、簡単な解決策を見つけることができないようです(たぶん1つはありません:()。私はすでに書かれているオープンソースutilまたは有料のutilを望んでいました。
たぶんこれ?
Converter.convertToAscii(String textFromAS400)
Converter.convertToEBCDIC(String textFromJava)
おかげで、
スコット
JTOpen 、IBMのオープンソースバージョンのJavaツールボックスには、ネイティブAS400テキストファイルにアクセスするFileReaderやFileWriterを含む、AS/400オブジェクトにアクセスするクラスのコレクションがあります。それはあなた自身の変換クラスを書くよりも使いやすいかもしれません。
JTOpenホームページから:
以下は、JTOpenを使用してアクセスできる多くのi5/OSおよびOS/400リソースのほんの一部です。
- データベース-JDBC(SQL)およびレコードレベルのアクセス(DDM)
- 統合ファイルシステム
- プログラム呼び出し
- コマンド
- データキュー
- データ領域
- リソースの印刷/スプール
- 製品およびPTF情報
- ジョブとジョブログ
- メッセージ、メッセージキュー、メッセージファイル
- ユーザーとグループ
- ユーザースペース
- システム値
- システムステータス
Javaの文字列は、Javaのネイティブエンコーディングでテキストを保持します。ASCIIまたはEBCDIC "文字列"をメモリに保持する場合、文字列としてエンコードする前に、byte []に入れます。
ASCII-> Java:新しい文字列(バイト、 "ASCII") EBCDIC-> Java:新しい文字列(バイト、 "Cp1047") Java-> ASCII:文字列。 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);
}
}
これは私が使ってきたものです。
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に書き込む)ため、auto-magical複数のAPIを介して通信しているため、エンコーディングは適用されませんでした。
私の問題は、特定の文字がマッピングされないという@scottyabの問題に似ていました。私の場合、参照しているサンプルコードは完全に機能しましたが、XML文字列をデータキューに書き込むと、[が£に置き換えられました。
何十年もの情報を持つ既存のデータベースバックエンドで作業するWeb開発者として、「誤った構成」を「正しく」するだけの能力を持っていませんでした他のコメント投稿者が示唆するように。
ただし、400にコマンドを発行して既知の正常なファイルDSPFFD *LIB*/*FILE*
のファイルフィールド情報を表示することにより、iがどのコード化文字セット識別子を使用しているかを確認できました。
そうすることで、特定のCCSIDセットを含む適切な情報が得られました:
CCSIDで求められる情報 の後、IBMで [〜#〜] ebcdic [〜#〜] のページに出くわしました。消える癖がある):
バージョン11.0.0拡張2進化10進コード(EBCDIC)は、zSeries(z /OS®)およびiSeries(Systemi®)で通常使用されるエンコード方式です。
そして最も役立つ:
EBCDIC CCSIDの例には、37、500、および1047があります。
私はすでに この質問自体から学んだ そのCp1047
は試すのに適した別の文字セットです(今回は、£がアクセント記号付きの「Y」に変わりました)Cp37
を試しましたそのような文字セットが存在しないことを確認するために、しかしCp037
を試行し、正しいエンコーディングを得ました。
キーがどのCoded Character Set Identifier(CCSID)がシステムで使用されているかを見つけて、jt400インスタンスが確実に機能するように見えますperfecting-私の場合はway私のライフタイムと数十年前のビジネスロジックの前に、as400のエンコーディングセットに100%一致します。
KwebbleとShawn Sの発言に補足したいと思います。 JTOpenを使用してこれを行うことができます。
6 0P(6バイト、10進数の後ろに何もない、パック)のフィールドに書き込む必要がありました。 DDMを理解していない人にとっては、これはdecimal(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 Sが述べたようにDSPPFDを見ると、テーブルがCCSID 37を使用していることがわかりました。これは機能しました。
Alan Kruegerの提案に従って、最初はCp1047を使用してみました。うまくいったようです。残念ながら、私のcustIdが5で終わった場合、ファイルにレンダリングされたデータは5FではなくB0でした。 Cp037に変更すると修正されました。
EBCDIC文字セット用のマップとASCII文字セット用のマップを1つ作成し、それぞれがもう一方の文字表現を返すようにすることは非常に簡単です。次に、文字列をループして翻訳して、マップ内の各文字を検索し、出力文字列に追加します。
コンバーターが公開されているかどうかはわかりませんが、1時間ほどで作成できます。