2008-12-15 12 views
16

मुझे ASCII से EBCDIC में कनवर्ट करने के लिए 'सरल' उपयोग लिखने की आवश्यकता है?जावा में ASCII से EBCDIC तक स्ट्रिंग कन्वर्ट करें?

Ascii जावा, वेब से आ रहा है और AS400 पर जा रहा है। मेरे पास एक Google था, मुझे एक आसान समाधान नहीं मिल रहा है (शायद coz वहाँ कोई नहीं है :()। मैं एक ओपनसोर्स उपयोग की उम्मीद कर रहा था या उपयोग के लिए चुकाया गया था जो पहले से ही लिखा गया है।

इस तरह हो सकता है?

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

धन्यवाद,

स्कॉट

+0

क्या आपको Redefines और पैक किए गए रिकॉर्ड से निपटना है, या यह एक सीधी हस्तांतरण है? – kemiller2002

उत्तर

10

JTOpen, उनके जावा टूलबॉक्स का आईबीएम के खुला स्रोत संस्करण देशी AS400 पाठ फ़ाइलों तक पहुँचने के लिए FileReader और FileWriter सहित AS/400 वस्तुओं, उपयोग करने के लिए कक्षाओं का संग्रह है:

स्ट्रिंग निर्माता का प्रयोग करें। अपने स्वयं के रूपांतरण वर्ग लिखने के बाद उपयोग करना आसान हो सकता है।

JTOpen मुख्यपृष्ठ से:

यहाँ कई i5/OS और OS/400 संसाधनों आप उपयोग कर उपयोग कर सकते हैं के कुछ ही रहे JTOpen:

  • डाटाबेस - JDBC (SQL) और रिकॉर्ड स्तर तक पहुँच (DDM)
  • एकीकृत फाइल सिस्टम
  • कार्यक्रम कॉल
  • आदेश
  • डाटा कतारों
  • डाटा क्षेत्रों
  • प्रिंट/स्पूल संसाधनों
  • उत्पाद और PTF जानकारी
  • नौकरियां और नौकरी लॉग
  • संदेश, संदेश कतार, संदेश फ़ाइलें
  • उपयोगकर्ता और समूह
  • उपयोगकर्ता रिक्त स्थान
  • सिस्टम मान
  • सिस्टम स्थिति
+0

हम जेटीओपेन टूल बॉक्स का उपयोग कर रहे हैं और यह कुछ कनवर्टन/मैपिंग कर रहा है, ऐसा लगता है कि यह गलत रूप से £, $, [और^ – scottyab

+1

को मैप करना गलत लगता है जैसे आपके एएस/400 को अपनी मूल भाषा के बारे में गलत तरीके से कॉन्फ़िगर किया गया है। यदि यह सही ढंग से स्थापित है jt400.jar किसी अन्य tweaking की आवश्यकता नहीं होगी। –

+0

हां, रूपांतरण मूल रूप से स्वचालित रूप से होना चाहिए। यदि ऐसा नहीं है, तो कुछ सही सेटअप नहीं है। –

0

यह और ASCII वर्ण सेट के लिए EBCDIC वर्ण सेट के लिए एक नक्शा है, और एक लिखने के लिए काफी सरल होना चाहिए, प्रत्येक में वापसी दूसरे का चरित्र प्रतिनिधित्व। फिर स्ट्रिंग पर अनुवाद करने के लिए बस लूप करें खा लिया, और नक्शे में प्रत्येक चरित्र को देखो और इसे आउटपुट स्ट्रिंग में संलग्न करें।

मुझे नहीं पता कि कोई कनवर्टर सार्वजनिक रूप से उपलब्ध है या नहीं, लेकिन इसे लिखने में एक घंटे से अधिक समय नहीं लगना चाहिए।

1

आप इस translation table के साथ एक अपनाsese बना सकते हैं।

लेकिन here एक ऐसी साइट है जिसमें जावा उदाहरण का लिंक है।

+1

दूसरा लिंक मर चुका है। क्या आप जानते हैं कि यह कहां गया? क्या आप यहां उदाहरण पोस्ट कर सकते हैं? –

2

आपको जावा वर्ण सेट सीपी 1047 (जावा 5) या सीपी 500 (जेडीके 1.3+) का उपयोग करना चाहिए। String(byte[] bytes, [int offset, int length,] String enc)

+0

आप सीपी037 भूल गए (हमारे पास वह है)। आपको सुझाव देना चाहिए कि व्यक्ति सत्यापित करता है कि कौन सा अक्षर इस्तेमाल किया जा रहा है। –

28

कृपया ध्यान दें कि जावा में एक स्ट्रिंग जावा के मूल एन्कोडिंग में टेक्स्ट रखती है। स्मृति में एएससीआईआई या ईबीसीडीआईसी "स्ट्रिंग" धारण करते समय, स्ट्रिंग के रूप में एन्कोडिंग से पहले, आप इसे बाइट [] में रखेंगे।

 
ASCII -> Java: new String(bytes, "ASCII") 
EBCDIC -> Java: new String(bytes, "Cp1047") 
Java -> ASCII: string.getBytes("ASCII") 
Java -> EBCDIC: string.getBytes("Cp1047") 
+4

कई ईबीसीडीआईसी कोड टेबल हैं। मैन्युअल रूप से सही होने के लिए यह बहुत कठिन है। –

+1

जावा वर्ण सेट जो "सीपी" से शुरू होता है, आईबीएम सीसीएसआईडी का संदर्भ देता है। इनमें से कुछ दस्तावेज http://www-03.ibm.com/systems/i/software/globalization/ccsid_list.html और http://www-03.ibm.com/systems/i/software/ पर पाए जा सकते हैं वैश्वीकरण/codepages.html CP1047 01047, "लैटिन 1/ओपन सिस्टम" का संदर्भ देता है। –

+0

@AlanKrueger आज के रूप में ये लिंक मर चुके हैं। वास्तव में बहुत बुरा है। –

0

यही वह है जो मैं उपयोग कर रहा हूं।

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(); 
    } 
} 
3
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 ""; 

    } 


} 

} 
+1

आपका स्वागत है! आपके समाधान को समझाते हुए जरूरी नहीं है, लेकिन अच्छी साइड इफेक्ट्स के साथ अच्छे अभ्यास को समझते हैं, जो लोग समझते हैं और इसलिए आपके उत्तर को ऊपर उठाते हैं। ;) –

0

शायद, like me आप सख्ती से एक JDBC सुविधा (एक Dataqueue को लिखते हुए मेरे उदाहरण में) का उपयोग नहीं कर रहे थे, तो ऑटो जादुई एन्कोडिंग आप पर लागू नहीं होता हम कर रहे हैं के बाद से एकाधिक एपीआई के माध्यम से संचार।

मेरा मुद्दा @ स्कॉट्यैब के मुद्दे के समान था, जिसमें कुछ वर्ण मैपिंग नहीं थे। मेरे मामले में, उदाहरण कोड मैं संदर्भित कर रहा था पूरी तरह से काम किया, लेकिन एक डेटाक्यू के लिए एक एक्सएमएल स्ट्रिंग लिखने के परिणामस्वरूप [£ के साथ प्रतिस्थापित किया जा रहा है।

दशकों की जानकारी के साथ पूर्व-मौजूदा डेटाबेस बैकएंड के साथ काम कर रहे एक वेब डेवलपर के रूप में, मेरे पास एक अन्य टिप्पणीकर्ता सुझाव के रूप में "गलत कॉन्फ़िगरेशन" "सही" करने की क्षमता नहीं थी। DSPFFD *LIB*/*FILE*:

हालांकि, मैं जो कोड किया गया वर्ण सेट पहचानकर्ता मैं संभावना एक ज्ञात अच्छा फ़ाइल पर फ़ाइल क्षेत्र के बारे में जानकारी प्रदर्शित करने के लिए 400 के लिए एक आदेश जारी करके उपयोग कर रहा था देखने के लिए सक्षम था।

ऐसा करने से मुझे विशेष CCSID सेट सहित अच्छी जानकारी, दिया: CCSID Identifier

कुछ information sought on CCSIDs के बाद, मैं के बाद से इस बात का एक आदत है पृष्ठ पर मुद्रित (महत्वपूर्ण जानकारी के साथ EBCDIC के लिए आईबीएम पर एक पृष्ठ में भाग गायब):

संस्करण 11.0.0 विस्तारित द्विआधारी कोडित दशमलव इंटरचेंज संहिता (EBCDIC) एक एन्कोडिंग स्कीम है कि आम तौर पर zSeries पर इस्तेमाल किया है (z/OS®) और iSeries (सिस्टम i®)।

और सबसे उपयोगी:

कुछ उदाहरण EBCDIC CCSIDs हैं 37, 500, और 1047.

के बाद से मैं पहले से ही learned from this question itself कि Cp1047 एक और अच्छे चरित्र की कोशिश करने के लिए सेट है (इस बार , £ एक उच्चारण "वाई" में बदल गया), मैंने Cp37 की कोशिश की ताकि ऐसा कोई वर्णमाला मौजूद न हो, लेकिन Cp037 का प्रयास किया और सही एन्कोडिंग प्राप्त की।

ऐसा लगता है कि चाबी की तरह लग रहा है जो कोड किया गया वर्ण सेट पहचानकर्ता (CCSID) आपके सिस्टम में इस्तेमाल किया जाता है, और यह सुनिश्चित करना है कि आपके jt400 उदाहरण - जो अन्यथा को परिपूर्ण काम कर रहा है - एन्कोडिंग पर स्थापित करने के लिए 100% से मेल खाता है as400, मेरे जीवनकाल और दशकों के व्यापार तर्क से पहले मेरे मामले में रास्ता

0

मैं एक कोड बनाता हूं जो आसानी से डेटा प्रकारों को बदलता है।

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); 
    } 
} 
0

मैं क्या Kwebble और शॉन एस ने कहा है कि करने के लिए पर जोड़ना चाहते हैं। मैं ऐसा करने के लिए जेटी ओपन का उपयोग कर सकता हूं।

मुझे उस क्षेत्र में लिखने की आवश्यकता थी जो 6 0 पी (6 बाइट्स, दशमलव के पीछे कुछ भी नहीं था) पैक किया गया था। यह उन लोगों के लिए एक दशमलव (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 का उल्लेख किया था। शॉन एस के रूप में डीएसपीपीएफडी को देखते हुए, मैंने पाया कि तालिका सीसीएसआईडी 37 का उपयोग कर रही थी। यह काम करता था।

मैंने एलन क्रूगर के सुझाव के अनुसार मूल रूप से सीपी 1047 का उपयोग करने की कोशिश की। यह काम करना प्रतीत होता था। दुर्भाग्यवश, यदि मेरा custId 5 के साथ समाप्त हुआ, तो फाइल में प्रस्तुत डेटा 5F के बजाय बी 0 था। इसे Cp037 में बदलना निश्चित है।

संबंधित मुद्दे