2008-12-15 267 views
16

我需要寫一個簡單的util來將ASCII碼轉換爲EBCDIC嗎?將字符串從ASCII轉換爲Java中的EBCDIC?

Ascii來自Java,Web和AS400。我有一個谷歌周圍,似乎無法找到一個簡單的解決方案(也許因爲沒有一個:()。我希望有一個開源的util或支付已經被寫入的util的應用程序

像這樣的可能?

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

感謝,

斯科特

+0

您是否需要處理重新定義和打包的記錄,或者這是直接轉換? – kemiller2002 2008-12-15 15:11:41

回答

10

JTOpen,IBM公司自己的Java工具箱的開源版本具有的類的集合訪問AS/400的物體,包括一個的FileReader和FileWriter的訪問本地AS400文本文件。這可能會更容易使用,然後編寫自己的轉換類。

從JTOpen主頁:

這裏僅僅是少數的衆多的i5/OS和OS/400的資源,您可以訪問使用JTOpen:

  • 數據庫 - JDBC(SQL)和記錄級訪問(DDM)
  • 集成文件系統
  • 程序調用
  • 命令
  • 數據隊列
  • 數據區
  • 打印/線軸資源
  • 產品和PTF信息
  • 作業和作業日誌
  • 消息,消息隊列,消息文件
  • 用戶和組
  • 用戶空格
  • 系統值
  • 系統狀態
+0

我們正在使用JTopen工具箱,它正在做一些轉換/映射,它似乎錯誤地映射了英鎊,美元,[和^ – scottyab 2008-12-16 10:56:45

+1

像你的AS/400的聲音被錯誤地配置爲它的本地語言。如果設置正確,jt400.jar將不需要任何其他調整。 – 2009-01-20 12:05:55

+0

是的,轉換應該基本上自動發生。如果不是,那麼設置不正確。 – 2010-03-26 16:32:45

0

它應該是相當簡單寫一個地圖的EBCDIC字符集,另一個用於ASCII字符集,並在每個返回字符表示的另一個,然後只是循環字符串轉換吃,並查找地圖中的每個字符,並將其附加到輸出字符串。

我不知道是否有任何轉換器公開可用,但編寫一個轉換器不應超過一個小時左右。

1

您可以用此translation table創建一個yoursef。

但是here是一個鏈接到Java示例的網站。

+1

第二個鏈接已經死亡。你知道它去了哪裏?你能在這裏發表這個例子嗎? – 2011-11-08 17:35:16

2

您應該使用Java字符集Cp1047(Java 5)或Cp500(JDK 1.3+)。

使用String構造:String(byte[] bytes, [int offset, int length,] String enc)

+0

你忘了Cp037(我們有那個)。您應該建議該人員驗證正在使用的字符集。 – 2017-08-21 16:19:53

28

請注意,Java中的字符串以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") 
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 ""; 

    } 


} 

} 
0

也許,like me你不嚴格使用JDBC功能(即寫入Dataqueue,在我的情況下),所以自動神奇編碼並不適用於你,因爲我們是通過多個API進行通信。

我的問題類似於@ scottyab的問題,某些字符沒有映射。在我的例子中,我引用的示例代碼非常完美,但是將一個xml字符串寫入數據隊列導致[被替換爲£。

作爲一名Web開發人員,他使用的是已有的數據庫後端,並且擁有數十年的信息,我並不僅僅能夠像其他評論者所說的那樣「糾正」錯誤配置

但是,我可以通過向400發出一個命令來顯示已知好文件上的文件字段信息:DSPFFD *LIB*/*FILE*,我能夠看到我可能使用哪個編碼字符集標識符。

這樣做給了我很好的信息,包括具體的CCSID集: CCSID Identifier

一些information sought on CCSIDs後,我遇到了在IBM的網頁爲EBCDIC印在頁面上(關鍵信息,因爲有個習慣消失):

11.0.0版擴展二進制編碼的十進制交換碼(EBCDIC) 是通常在zSeries中使用的編碼方案(Z/OS)和 i系列(系統I®)。

而且最有幫助的:

一些示例EBCDIC CCSID的是37,500,和1047

既然我已經learned from this question itselfCp1047是另一個很好的字符集來嘗試(此時間,英鎊變成了重音「Y」),我試圖Cp37看到沒有這樣的charsset存在,但試圖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和Shawn 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提到過。如Shawn S所提到的那樣查看DSPPFD,我發現該表使用的是CCSID 37.這起作用。

我最初嘗試使用Cp1047,按照Alan Krueger的建議。它似乎工作。不幸的是,如果我的custId以5結尾,渲染到文件中的數據是B0而不是5F。將其更改爲Cp037可以解決該問題。