Domanda

Esiste una libreria java gratuita che posso usare per convertire la stringa in una codifica in un'altra codifica, qualcosa come iconv ? Sto usando Java versione 1.3.

È stato utile?

Soluzione

Non hai bisogno di una libreria oltre a quella standard: usa 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 i refusi.)

EDIT: come sottolineato nei commenti, è ancora possibile utilizzare le istanze Charset ma avere la facilità d'uso dei metodi String: nuova stringa (byte, set di caratteri) e String. getBytes (charset) .

Vedi " Codifica URL (o: 'Cosa sono quelli " < codice>% 20 " codici negli URL? ') " ;.

Altri suggerimenti

CharsetDecoder dovrebbe essere quello che stai cercando, no?

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

Vedi Charset . Ciò non significa che UTF16 sia il set di caratteri predefinito (ovvero: il mapping " predefinito tra le sequenze di unità di codice Unicode e sequenze di byte "):

  

Ogni istanza della macchina virtuale Java ha un set di caratteri predefinito, che può essere o meno uno dei set di caratteri standard.
  [ US-ASCII , ISO-8859-1 aka ISO-LATIN-1 , UTF-8 , < codice> UTF-16BE
, UTF-16LE , UTF-16 ]
  Il set di caratteri predefinito viene determinato durante l'avvio della macchina virtuale e in genere dipende dalla locale e dal set di caratteri utilizzati dal sistema operativo sottostante.

Questo esempio dimostra come convertire ISO-8859-1 byte codificati in un ByteBuffer in 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) {
}

Vorrei solo aggiungere che se la stringa è originariamente codificata utilizzando una codifica errata, potrebbe essere impossibile cambiarla in un'altra codifica senza errori. La domanda non afferma che la conversione qui è fatta dalla codifica errata alla codifica corretta, ma mi sono imbattuto personalmente in questa domanda solo a causa di questa situazione, quindi solo un testa a testa per gli altri.

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

È molto più semplice se si pensa all'unicode come a un set di caratteri (che in realtà è - è fondamentalmente l'insieme numerato di tutti i personaggi conosciuti). 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 del tempo Java utilizzava UCS-2 per codificare il set di caratteri unicode. Questo poteva gestire solo 2 byte per carattere ed è ora obsoleto. È stato abbastanza ovvio aggiungere coppie surrogate e passare a UTF-16.

Molte persone pensano che avrebbero dovuto usare UTF-8 in primo luogo. Quando Java era stato originariamente scritto Unicode aveva comunque molto più di 65535 caratteri ...

UTF-8 e UCS-2 / UTF-16 possono essere distinti ragionevolmente facilmente tramite un contrassegno dell'ordine dei byte all'inizio del file. Se questo esiste, allora è una buona scommessa che il file sia in quella codifica - ma non è una certezza morta. Potresti anche scoprire che il file si trova in una di quelle codifiche, ma non ha un contrassegno dell'ordine dei byte.

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

Non c'è idea di leggere un file " com'è " e tuttavia ottenere il testo: un file è una sequenza di byte, quindi è necessario applicare una codifica dei caratteri per decodificare quei byte in caratteri.

Fonte di stackoverflow

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top