Proprietà Java codifica UTF-8 in Eclipse

Di recente ho dovuto modificare 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 bene. Le proprietà mostrano tuttavia alcuni comportamenti strani.

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

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

ma l’app 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 dei file facendo clic destro e selezionando “Altro: UTF8” ma non ha aiutato. Diceva anche: “determinato dal contenuto: ISO-8859-1”

Sto usando Java 6 e Jboss Developer basati su Eclipse 3.3

Posso conviverci modificando le proprietà in Notepad ++ e incollandole in Eclipse, ma sarei grato se qualcuno potesse aiutarmi a risolverlo in Eclipse.

Non perdere tempo, puoi utilizzare il plugin del bundle di risorse in Eclipse

Schermata di base

Vecchia pagina Sourceforge

I file delle proprietà sono ISO-8859-1 per definizione: consultare i documenti per la class Proprietà .

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

EDIT: Come notato da Laurence nei commenti, Java 1.6 ha introdotto sovraccarichi per il load e lo store che richiedono un Reader / Writer . Ciò significa che puoi creare un lettore per il file con qualunque codifica tu voglia e passarlo per load . Sfortunatamente FileReader continua a non permettervi di specificare la codifica nel costruttore (aargh), quindi sarete bloccati con il concatenamento di FileInputStream e InputStreamReader . Tuttavia, funzionerà.

Ad esempio, per leggere un file utilizzando 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(); } 

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

Dalla documentazione della class:

Quando si salvano le proprietà su un stream o si caricano da un stream, 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.

Dal metodo API, store ():

I caratteri inferiori a \ u2020 ei caratteri maggiori di \ u007E vengono scritti come \ uxxxx per il valore esadecimale appropriato xxxx.

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

Funziona come un fascino

🙂

Ci sono troppi punti nel processo che descrivi dove possono verificarsi errori, quindi non cercherò di indovinare cosa stai facendo male, ma penso di sapere cosa sta succedendo sotto il cofano.

EF BF BD è la forma codificata 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 // salva come ISO-8859-1
 0xFC => U + FFFD // letto come UTF-8
 U + FFFD => 0xEF 0xBF 0xBD // salva come UTF-8
 0xEF 0xBF 0xBD => \ u00EF \ u00BF \ u00BD // native2ascii 

Ti suggerisco di lasciare la proprietà “file.encoding” da sola. 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.

 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 farlo in 1.5, poiché la class Properties non ha un metodo per analizzare InputStreamReader .

C’è un modo molto più semplice:

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

Solo un altro plugin Eclipse per i file * .properties:

Editor delle proprietà

Questo sembra funzionare solo per alcuni personaggi … compresi i 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?

Vi consiglio di usare Attesoro ( http://attesoro.org/ ). È semplice e facile da usare. Ed è fatto in java.

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

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

Se le proprietà sono per XML o HTML, è più sicuro utilizzare le quadro 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 quadro che XML non ha, quindi lo tengo sicuro usando l’XML diretto: http://www.w3.org/TR/html4/sgml/entities.html