سؤال

أريد أن أكتب "بسيط" util لتحويل من ASCII إلى EBCDIC?

Ascii قادم من جافا ويب والذهاب إلى AS400.لقد كان جوجل حولها ، لا يمكن أن يبدو للعثور على حل سهل (ربما لأنه لا يوجد أحد :( ).كنت أتمنى مفتوحة المصدر util أو دفع util التي سبق أن كتبت.

مثل هذا ربما ؟

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

شكرا

سكوت

هل كانت مفيدة؟

المحلول

JTOpen, IBM نسخة مفتوحة المصدر من جافا الأدوات لديه مجموعة من الطبقات للوصول إلى AS/400 الكائنات ، بما في ذلك FileReader و FileWriter للوصول إلى الأم AS400 ملفات نصية.قد يكون من الأسهل استخدام ثم الكتابة الخاصة بك تحويل الطبقات.

من JTOpen الصفحة الرئيسية:

هنا هي مجرد عدد قليل من العديد من i5/نظام التشغيل OS/400 الموارد يمكنك الوصول إليها باستخدام JTOpen:

  • قاعدة البيانات -- JDBC (SQL) و سجل مستوى الوصول (DDM)
  • ملف متكامل نظام
  • برنامج المكالمات
  • الأوامر
  • بيانات قوائم الانتظار
  • البيانات المناطق
  • طباعة/التخزين المؤقت الموارد
  • المنتج PTF المعلومات
  • وظائف و عمل سجلات
  • رسائل انتظار الرسالة ، رسالة الملفات
  • المستخدمين والمجموعات
  • المستخدم المساحات
  • نظام القيم
  • حالة النظام

نصائح أخرى

تجدر الإشارة إلى أن سلسلة في جاوة يحمل النص في الترميز الأصلي جاوة. عندما عقد 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 "";

    }


}

}

ويجب عليك استخدام إما مجموعة الأحرف جافا Cp1047 (جافا 5) أو Cp500 (JDK 1.3 +).

استخدم منشئ سلسلة: String(byte[] bytes, [int offset, int length,] String enc)

ويمكنك إنشاء yoursef واحد مع هذا جدول ترجمة .

ولكن هنا هو موقع يحتوي على وصلة لمثال جافا.

وأقوم بإجراء التعليمات البرمجية التي تحول أنواع البيانات بسهولة.

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 ميزة (الكتابة إلى Dataqueue في بلدي على سبيل المثال) ، وبالتالي فإن السيارات السحرية ترميز لم تنطبق عليك منذ نحن نتواصل من خلال واجهات برمجة تطبيقات متعددة.

بلدي المسألة مشابهة @scottyab قضية مع بعض الشخصيات لا رسم الخرائط.في حالتي ، رمز المثال كان الرجوع عملت تماما ، ولكن كتابة سلسلة xml إلى dataqueue نتجت في [ محل جنيه استرليني.

كمطور ويب تعمل مع قاعدة بيانات موجودة مسبقا الخلفية مع عقود من المعلومات ، لم يكن ببساطة لديهم القدرة على "الحق" على "سوء التكوين" باعتبارها واحدة أخرى المعلق يوحي.

ومع ذلك, كنت قادرا على رؤية أي ترميز مجموعة الأحرف معرف كان من المحتمل استخدام طريق إصدار الأوامر إلى 400 لعرض ملف المعلومات الميدانية على المعروف جيدة الملف: DSPFFD *LIB*/*FILE*.

ذلك أعطاني معلومات جيدة بما في ذلك CCSID مجموعة:CCSID Identifier

بعد بعض المعلومات المطلوبة على CCSIDs, صادفت صفحة على IBM عن EBCDIC مع مفتاح المعلومات المطبوعة على الصفحة (منذ أن لديه عادة من الزوال):

الإصدار 11.0.0 Extended Binary Coded Decimal Interchange Code (EBCDIC) هو نظام الترميز الذي يستخدم عادة في بيئات تشغيل zseries (z/OS®) ، iSeries (نظام®).

والأكثر فائدة:

بعض الأمثلة على EBCDIC CCSIDs هي 37, 500, و 1047.

منذ كنت بالفعل تعلمت من هذا السؤال نفسه أن Cp1047 جيد آخر حرف مجموعة في محاولة (هذا الوقت ، £ تحولت إلى معلمة "Y") ، حاولت Cp37 أن لا نرى مثل هذه charsset موجودة ، ولكن حاول Cp037 و حصلت على الحق في الترميز.

يبدو أن المفتاح هو إيجاد والتي ترميز مجموعة الأحرف معرف (CCSID) يستخدم في النظام الخاص بك ، وضمان أن jt400 سبيل المثال - والتي هي على خلاف ذلك العامل إتقان - مباريات 100% إلى ترميز مجموعة على as400 ، في حالتي طريقة قبل حياتي عقود من منطق الأعمال قبل.

وأريد أن أضيف إلى ما قاله Kwebble وشون S. يمكنني استخدام JTOpen للقيام بذلك.

وأنا في حاجة إلى الكتابة إلى الحقل الذي كان 6 0P (6 بايت، لا شيء وراء عشري، ومعبأة). هذا عشري (11،0) لأولئك منكم الذين لا جروك DDM.

    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. وعند النظر إلى DSPPFD كما ذكر شون S، اكتشفت أن الجدول كان يستخدم CCSID 37. عملت هذه.

وحاولت في البداية استخدام Cp1047، وفقا لاقتراح آلان كروجر و. على ما يبدو للعمل. لسوء الحظ، إذا انتهت بلدي رقم عميل مع 5، وكانت البيانات المقدمة في ملف B0 بدلا من 5F. تغييرها إلى Cp037 الثابتة ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top