2009-05-14 21 views
46

Recentemente ho dovuto cambiare la codifica della webapp su cui sto lavorando da ISO-xx a utf8. Tutto è andato liscio, tranne i file delle proprietà. Ho aggiunto -Dfile.encoding=UTF-8 in eclipse.ini e i file normali funzionano correttamente. Le proprietà mostrano tuttavia alcuni comportamenti strani.Proprietà Java Codifica UTF-8 in Eclipse

Se copio le proprietà codificate utf8 da Notepad ++ e le incollo in Eclipse, esse mostrano e funzionano correttamente. Quando riapro file di proprietà, vedo alcuni caratteri Unicode invece di quelli propri, come:

Zur\u00EF\u00BF\u00BDck instead of Zurück 

ma applicazione funziona ancora bene. Se inizio a modificare le proprietà, aggiungo alcuni caratteri speciali e salvo, vengono visualizzati correttamente, tuttavia non funzionano e tutti i caratteri speciali che funzionano in precedenza non funzionano più.

Quando paragono la versione locale con CVS posso vedere caratteri speciali correttamente sul file remoto e dopo l'aggiornamento sono di nuovo in start: l'app funziona, ma Eclipse visualizza i caratteri Unicode.

Ho provato a cambiare la codifica del file facendo clic destro e selezionando "Altro: UTF8" ma non è stato d'aiuto. Ha anche detto: “determinato dal contenuto: ISO-8859-1”

sto usando Java 6 e JBoss Developer basato su Eclipse 3.3

posso vivere con esso modificando le proprietà in Notepad ++ e incollandoli in Eclipse, ma sarei grato se qualcuno potesse aiutarmi a risolvere questo problema in Eclipse.

risposta

51

Non sprecate il vostro tempo, è possibile utilizzare Resource Bundle plugin in Eclipse

Basic Screen Shot

Old Sourceforge page

+3

Questo è un plugin estremamente utile, grazie per il suggerimento! Così male non ha un URL di installazione, ma basta lasciarlo nella cartella dei plugin per fare il trucco – chesterbr

+3

Questo usa lo strumento native2ascii per i caratteri non unicode internamente o dovrei scappare manualmente i simboli Unicode? –

+0

@ baybora.oren: ho espanso il file .zip nel plugin della cartella eclipse, ma non vedo alcun cambiamento nell'ide (arresto e riavvio di eclissi). Qualche suggerimento? – Sefran2

62

I file di proprietà sono ISO-8859-1 per definizione - consultare i documenti per la classe Properties.

Spring ha una sostituzione che può essere caricata con una codifica specifica, utilizzando PropertiesFactoryBean.

EDIT: Come Laurence notato nei commenti, Java 1.6 ha introdotto sovraccarichi per load e store che prendono un Reader/Writer. Ciò significa che puoi creare un lettore per il file con qualsiasi codifica tu voglia e passarlo a load. Sfortunatamente FileReaderancora non consente di specificare la codifica nel costruttore (aargh) in modo da rimanere bloccati con il concatenamento FileInputStream e InputStreamReader insieme. Tuttavia, funzionerà.

Ad esempio, per leggere un file usando UTF-8:

Properties properties = new Properties(); 
InputStream inputStream = new FileInputStream("path/to/file"); 
try { 
    Reader reader = new InputStreamReader(inputStream, "UTF-8"); 
    try { 
     properties.load(reader); 
    } finally { 
     reader.close(); 
    } 
} finally { 
    inputStream.close(); 
} 
+5

In Java 1.6 è possibile utilizzare altre codifiche utilizzando i metodi che utilizzano Reader/Writer anziché InputStream/OutputStream. –

+0

Una soluzione più generale rispetto a quella nella risposta accettata, quindi meglio :) –

12

Non è un problema con Eclipse. Se si utilizza la classe Proprietà per leggere e memorizzare il file delle proprietà, la classe sfuggirà a tutti i caratteri speciali.

From the class documentation:

Quando si salva oggetti da un ruscello o caricandoli da un flusso, viene utilizzata la codifica dei caratteri ISO 8859-1. Per i caratteri che non possono essere rappresentati direttamente in questa codifica, vengono utilizzati gli escape Unicode; tuttavia, solo un singolo carattere 'u' è permesso in una sequenza di escape. Lo strumento native2ascii può essere utilizzato per convertire i file di proprietà da e verso altre codifiche di caratteri.

From the API, store() method:

personaggi meno di \ u0020 e personaggi maggiori di \ u007E sono scritti come \ uXXXX per il xxxx valore esadecimale appropriato.

+0

Ero solo skeet'd ... :( –

+3

NetBeans visualizza in modo carino i file delle proprietà che hanno escape \ uXXXX e ti consente di modificarli con i caratteri UTF visualizzati correttamente Perché non Eclipse? Secondo me questo è un problema con Eclipse. – ChrisB

+0

+1: il così tanto di sollievo per essere stato skeet'd – rexford

4

sono presenti troppi punti del processo che si descrive dove possono verificarsi errori, quindi non cercare di indovinare quello che stai facendo male, ma credo di sapere cosa sta succedendo sotto il cofano.

EF BF BD è il formato codificato UTF-8 di U+FFFD, il carattere di sostituzione standard inserito dai decodificatori quando incontrano input non validi. Sembra che il tuo testo sia stato salvato come ISO-8859-1, quindi letto come se fosse UTF-8, quindi salvato come UTF-8, quindi convertito nel formato Properties usando native2ascii usando la codifica predefinita della piattaforma (ad esempio, windows- 1252).

ü    => 0xFC    // save as ISO-8859-1 
0xFC   => U+FFFD    // read as UTF-8 
U+FFFD   => 0xEF 0xBF 0xBD  // save as UTF-8 
0xEF 0xBF 0xBD => \u00EF\u00BF\u00BD // native2ascii

Suggerisco di lasciare la proprietà "file.encoding" da solo. Come "file.separator" e "line.separator", non è così utile come ci si aspetterebbe che fosse. Invece, prendi l'abitudine di specificare sempre una codifica durante la lettura e la scrittura di file di testo.

1

Questo sembra funzionare solo per alcuni personaggi ... compresi caratteri speciali per tedesco, portoghese, francese. Tuttavia, ho avuto problemi con i caratteri russi, hindi e mandarini. Questi non vengono convertiti in formato Properties 'native2ascii', ma vengono salvati con ?? ?? ??
L'unico modo per far sì che la mia app visualizzi correttamente questi caratteri è inserirli nel file delle proprietà tradotto in formato UTF-8 - come \ u0915 invece di क o \ u044F invece di я. Qualche consiglio?

+0

Puoi usare org.springframework.context.support.ReloadableResourceBundleMessageSource di Spring che supporta UTF- 8 file di proprietà codificati Usiamo Spring per gestire le traduzioni in inglese, tedesco, francese e cinese nelle applicazioni web basate su spring-mvc – rexford

9
Properties props = new Properties(); 
URL resource = getClass().getClassLoader().getResource("data.properties");   
props.load(new InputStreamReader(resource.openStream(), "UTF8")); 

funziona come un fascino

:-)

+0

Purtroppo props.load, in 1.6, richiede un InputStream e indica specificamente che si aspetta la vecchia scuola ISO-8859-1 –

4
Properties props = new Properties(); 
URL resource = getClass().getClassLoader().getResource("data.properties");   
props.load(new InputStreamReader(resource.openStream(), "UTF8")); 

questo funziona bene in java 1.6. Come posso fare questo in 1.5, poiché la classe Properties non ha un metodo per pars InputStreamReader.

-1

Se le proprietà sono per XML o HTML, è più sicuro da usare entità XML. Sono più brutti da leggere, ma ciò significa che il file delle proprietà può essere trattato come ASCII semplice, quindi nulla verrà rimosso.

Nota che HTML ha le entità che XML non fa, così ho tenerlo al sicuro utilizzando XML dritto: http://www.w3.org/TR/html4/sgml/entities.html

4

C'è modo molto più semplice:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8")); 
1

È possibile definire i file .properties UTF-8 per memorizzare le vostre traduzioni e utilizzare ResourceBundle, per ottenere i valori. Per evitare problemi è possibile modificare la codifica:

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");