2014-07-07 4 views
6

Quello che sto cercando di fare è abbastanza semplice:Conversione greco maiuscolo in Java

String example = "Τάχιστη αλώπηξ βαφής ψημένη γη - Mary Had A Little Lamb"; 
String upper = example.toUpperCase(); 

In greco, solo la prima lettera di una parola maiuscola dovrebbe contenere caratteri accentati.

// upper contains the following (incorrect) string: 
// ΤΆΧΙΣΤΗ ΑΛΏΠΗΞ ΒΑΦΉΣ ΨΗΜΈΝΗ ΓΗ - MARY HAD A LITTLE LAMB 

// correct string: 
// ΤΑΧΙΣΤΗ ΑΛΩΠΗΞ ΒΑΦΗΣ ΨΗΜΕΝΗ ΓΗ - MARY HAD A LITTLE LAMB 

(. Gli accenti sono difficili da vedere, ma sono lì)

Secondo il Java 1.7 documentation, dovrei essere in grado di passare un locale a toUpperCase, in questo modo:

String upper = example.toUpperCase(new java.util.Locale("el")); 

Tuttavia, sembra che non vi siano regole specifiche per toUpperCase che gestiscono correttamente il greco.

E 'possibile definire il comportamento di toUpperCase per una specifica localizzazione, in modo che possa essere sicuro di ottenere il risultato corretto?

In alternativa, posso semplicemente scrivere una classe di utilità per gestire questo caso particolare. Ma se è possibile, preferirei sovrascrivere questa funzione per locale, nel caso in cui questo venisse fuori per altre lingue.

+3

Guardando all'origine di 'toUpperCase', sembra che traduca ogni singolo carattere singolarmente senza guardare il resto del testo, tranne tre casi: turco, azero, lituano. Quelli sono cablati nel codice. Quindi probabilmente dovrai tirare il tuo. (P.S. Forse dovresti inviarlo come segnalazione di bug a Oracle.) – ajb

+0

Questo è ciò di cui avevo paura. Non ne ho visto uno, ma speravo che ci fosse un modo per estendere quel comportamento per locale. –

+1

P.S. Il codice cablato appare come 'booleano localeDependent = (lang ==" tr "|| lang ==" az "|| lang ==" lt ");'. _Sono usando '==' per confrontare le stringhe._ Gaaaaaaaaack. – ajb

risposta

0

Per @ajb, questo non è supportato in Java per impostazione predefinita. Ho dovuto creare la mia soluzione.

0

Ho provato quanto segue e sembrava funzionare:

String example = "Τάχιστη αλώπηξ βαφής ψημένη γη - Mary Had A Little Lamb"; 
String upper = example.toUpperCase(); 
String temp = Normalizer.normalize(upper, Normalizer.Form.NFD); 
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+"); 
System.out.println(pattern.matcher(temp).replaceAll(""));