2009-04-21 16 views
12

Il nostro requisito è inviare testo EBCDIC al mainframe. Abbiamo alcuni caratteri cinesi quindi in formato UTF8. Quindi, c'è un modo per convertire i caratteri UTF-8 in EBCDIC?da UTF-8 a EBCDIC in Java

Grazie, Raj Mohan

+0

La conversione da UTF-8 a EBCDIC non ha perdite? Cioè, puoi trasformare avanti e indietro e ottenere sempre gli stessi byte EBCDIC ogni volta? –

risposta

8

Assumendo che il sistema di destinazione è un mainframe IBM o di fascia media, che ha il pieno supporto per tutte le codifiche EBCDIC integrate in essa la JVM come codifiche nome CPxxxx, corrispondente di IBM CCSID (CP sta per code-page). Dovrai eseguire le traduzioni sul lato host poiché il lato client non avrà il necessario supporto per la codifica.

Dato che Unicode è DBCS e superiore e supporta tutti i caratteri noti, è probabile che il targeting riguardi più codifiche EBCDIC; quindi probabilmente configurerai le codifiche in qualche modo. Cerca di avere il tuo client Unicode (UTF-8, UTF-16, ecc.) Solo, con le traduzioni eseguite mentre i dati arrivano sull'host e/o lasciano il sistema host.

Oltre a dover eseguire traduzioni host-side, i meccanismi sono gli stessi di qualsiasi traduzione Java; per esempio. nuova stringa (byte, codifica) e String.getBytes (codifica) e le varie classi NIO e writer. Non c'è davvero alcuna magia - non è diverso dal tradurre tra, ad esempio, ISO 8859-x e Unicode, o qualsiasi altro SBCS (o DBCS limitato).

Ad esempio:

byte[] ebcdta="Hello World".getBytes("CP037"); // get bytes for EBCDIC codepage 37 

È possibile trovare ulteriori informazioni su IBM's documentation website.

4

EBCDIC ha molte pagine codici a 8 bit. Molti di questi sono supportati dalla VM. Date un'occhiata a Charset.availableCharsets().keySet(), le pagine EBCDIC sono denominate IBM... (ci sono alias come cp500 per IBM500 come potete vedere per Charset.forName("IBM500").aliases()).

ci sono due problemi:

  1. se avete personaggi inclusi in diverse pagine di codice di EBCDIC, questo non aiuta
  2. non sono sicuro, se questi set di caratteri sono disponibili in tutte le finestre esterne VM.

Per il primo, dare un'occhiata a this approach. Per il secondo, provate sul tempo di utilizzo desiderato ;-)

+0

Non tutti i set di caratteri denominati 'IBM *' sono EBCDIC. Ad esempio, [IBM850] (http://en.wikipedia.org/wiki/Code_page_850) è la codepage standard utilizzata negli Stati Uniti e nelle versioni europee occidentali di Windows nel prompt dei comandi. – lavinio

0

Per il midrange AS/400 (IBM i in questi giorni) la soluzione migliore è utilizzare IBM Java Toolkit (jt400.jar) che fa tutto questo le cose in modo trasparente (forse leggermente accennato).

Si prega di notare che all'interno di Java un carattere è un valore a 16 bit, non un UTF-8 (cioè una codifica).

2

È sempre possibile utilizzare IBM Toolbox per Java (JTOpen), in particolare la classe com.ibm.as400.access.AS400Text in jt400.jar.

Si va come segue:

int codePageNumber = 420; 
String codePage = "CP420"; 
String sourceUtfText = "أحمد يوسف صالح"; 

AS400Text converter = new AS400Text(sourceUtfText.length(), codePageNumber); 
byte[] bytesData = converter.toBytes(sourceUtfText); 
String resultedEbcdicText = new String(bytesData, codePage); 

ho usato il code-page e la sua rappresentazione java corrispondente della codifica CP420, questo codice-pagina viene utilizzata per il testo in arabo, così, si dovrebbe scegliere la code page adatta per il testo cinese.