2008-10-23 18 views
28

C'è qualche libreria java libera che posso usare per convertire una stringa in una codifica in un'altra codifica, qualcosa come iconv in php? Sto usando la versione 1.3 di java.Conversione codifica in java

risposta

38

Non hai bisogno di una libreria di oltre lo standard one - basta usare Charset. (Puoi semplicemente usare i costruttori String e i metodi getBytes, ma personalmente non mi piace lavorare con i nomi delle codifiche dei caratteri. Troppo spazio per gli errori di battitura.)

MODIFICA: Come indicato nei commenti, puoi ancora utilizzare le istanze Charset ma avere la facilità di utilizzo dei metodi String: new String(bytes, charset) e String.getBytes(charset).

+3

Preferisco i nuovi String (byte [], encoding) e String.getBytes (encoding) nella maggior parte dei casi, perché sono semplici one-liners in contrasto con l'API più potente ma più complicata di Charset (che, BTW, è disponibile solo in Java 1.4+). – Alexander

+3

Sì, è un peccato che l'API Charset sia così complicata. La classe .NET System.Encoding fa davvero bene, IMO - e mantiene la funzionalità fuori da String. –

+0

Collegamenti fissi. Vedi http://www.free-scripts.net/html_tutorial/html/topics/urlencoding.htm – VonC

18

CharsetDecoder dovrebbe essere quello che stai cercando, no?

Molti protocolli di rete e file memorizzano i propri caratteri con un set di caratteri orientato ai byte come ISO-8859-1 (ISO-Latin-1).
Tuttavia, la codifica dei caratteri nativi di Java è Unicode UTF16BE (formato di trasformazione UCS a 16 bit, ordine byte big-endian).

Vedere Charset. Ciò non significa che UTF16 è il set di caratteri di default (cioè: il "mapping tra sequenze di sedici bit Unicode code units e sequenze di byte" di default):

Ogni istanza della macchina virtuale Java è un set di caratteri di default , che può o non può essere uno dei caratteri standard.
[US-ASCII, ISO-8859-1 pseudonimo ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
Il set di caratteri predefinito viene determinato durante l'avvio di macchina virtuale e tipicamente dipende dalla localizzazione e charset utilizzato dal sistema operativo sottostante.

Questo esempio dimostra come convertire ISO-8859-1 byte codificati in un ByteBuffer una stringa in un CharBuffer e viceversa.

// Create the encoder and decoder for ISO-8859-1 
Charset charset = Charset.forName("ISO-8859-1"); 
CharsetDecoder decoder = charset.newDecoder(); 
CharsetEncoder encoder = charset.newEncoder(); 

try { 
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer 
    // The new ByteBuffer is ready to be read. 
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string")); 

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string. 
    // The new ByteBuffer is ready to be read. 
    CharBuffer cbuf = decoder.decode(bbuf); 
    String s = cbuf.toString(); 
} catch (CharacterCodingException e) { 
} 
+0

Da http://www.exampledepot.com/egs/java.nio.charset/ConvertChar.html – VonC

+3

Unicode non è una codifica! UTF-8, UTF-16 ecc. Vedi http://www.joelonsoftware.com/articles/Unicode.html –

+0

@SealedSun: molto vero. Ho risolto la sezione "codifica java nativa" nella mia risposta. – VonC

0

E 'molto più facile se si pensa di Unicode come un set di caratteri (che in realtà è - è molto fondamentalmente la serie numerata di tutti i personaggi noti). Puoi codificarlo come UTF-8 (1-3 byte per carattere a seconda) o forse UTF-16 (2 byte per carattere o 4 byte usando coppie surrogate).

Indietro nella nebbia dei tempi Java utilizzava UCS-2 per codificare il set di caratteri Unicode. Questo potrebbe gestire solo 2 byte per carattere e ora è obsoleto. È stato un trucco abbastanza ovvio aggiungere coppie surrogate e passare a UTF-16.

Un sacco di gente pensa che avrebbe dovuto usare UTF-8 in primo luogo. Quando Java era stato originariamente scritto, l'Unicode aveva ben più di 65535 caratteri in ogni caso ...

0

UTF-8 e UCS-2/UTF-16 si distingue facilmente facilmente tramite un segno di ordinamento dei byte all'inizio del file. Se questo esiste allora è una buona scommessa che il file è in che codifica - ma non è una certezza morto. Potresti anche scoprire che il file si trova in una di queste codifiche, ma non ha un contrassegno di ordine dei byte.

Non so molto di ISO-8859-2, ma non sarei sorpreso se quasi tutti i file fossero un file di testo valido in quella codifica. Il meglio che sarai in grado di fare è controllarlo euristicamente. In effetti, la pagina di Wikipedia che ne parla suggerirebbe che solo il byte 0x7f non è valido.

Non si ha idea di leggere un file "così com'è" e ancora ottenere il testo - un file è una sequenza di byte, quindi è necessario applicare una codifica di caratteri per decodificare quei byte in caratteri.

Fonte da StackOverflow

2

vorrei solo aggiungere che se la stringa è originariamente codificato utilizzando la codifica sbagliata potrebbe essere impossibile cambiare ad un'altra codifica senza errori. La domanda non dice che la conversione qui è fatta da una codifica errata per correggere la codifica, ma personalmente mi sono imbattuto in questa domanda solo a causa di questa situazione, quindi solo un testa a testa anche per gli altri.

Questa risposta in altra domanda dà una spiegazione del perché la conversione non produce sempre risultati corretti https://stackoverflow.com/a/2623793/4702806