Codifica conversione in Java
-
04-07-2019 - |
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.
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
akaISO-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