2015-09-21 11 views
8

Ho il seguente problema. Sto cercando di sostituire le dieresi tedesche come , ö, ü in java. Ma semplicemente non funziona. Qui è il mio codice:java sostituisce le dieresi tedesche

private static String[][] UMLAUT_REPLACEMENTS = { { "Ä", "Ae" }, { "Ü", "Ue" }, { "Ö", "Oe" }, { "ä", "ae" }, { "ü", "ue" }, { "ö", "oe" }, { "ß", "ss" } }; 
public static String replaceUmlaute(String orig) { 
    String result = orig; 

    for (int i = 0; i < UMLAUT_REPLACEMENTS.length; i++) { 
     result = result.replaceAll(UMLAUT_REPLACEMENTS[i][0], UMLAUT_REPLACEMENTS[i][1]); 
    } 

    return result; 
} 

Un ä rimane un ä e così via. Non so se questo problema ha qualcosa a che fare con la codifica, ma la stringa contiene il carattere esatto che sto cercando di sostituire.

Grazie in anticipo

+2

Ho appena testato e funziona come previsto, il problema deve essere altrove. – Tunaki

+1

Funziona come previsto. Dovresti anche considerare l'uso di 'String # replace' invece di' String # replaceAll', dato che hai a che fare con letterali e non con espressioni regolari. – Mena

+0

Si consiglia di verificare l'input dei metodi. Come stai inserendo i dati per il metodo? Hard coded? Via CLI? – Jan

risposta

4

questo alla fine ha funzionato per me:

private static String[][] UMLAUT_REPLACEMENTS = { { new String("Ä"), "Ae" }, { new String("Ü"), "Ue" }, { new String("Ö"), "Oe" }, { new String("ä"), "ae" }, { new String("ü"), "ue" }, { new String("ö"), "oe" }, { new String("ß"), "ss" } }; 
public static String replaceUmlaute(String orig) { 
    String result = orig; 

    for (int i = 0; i < UMLAUT_REPLACEMENTS.length; i++) { 
     result = result.replace(UMLAUT_REPLACEMENTS[i][0], UMLAUT_REPLACEMENTS[i][1]); 
    } 

    return result; 
} 

Quindi grazie a tutte le vostre risposte e aiuto. Alla fine è stata una miscela di nafas (con la nuova String) e Joop Eggen (la corretta dichiarazione di sostituzione). Grazie mille!

5

Il codice guarda bene, replaceAll() dovrebbe funzionare come previsto.

Prova questa, se anche voi volete conservare la capitalizzazione (ad esempio ÜBUNG diventerà UEBUNG, non UeBUNG):

private static String replaceUmlaut(String input) { 

    //replace all lower Umlauts 
    String output = input.replace("ü", "ue") 
          .replace("ö", "oe") 
          .replace("ä", "ae") 
          .replace("ß", "ss"); 

    //first replace all capital umlaute in a non-capitalized context (e.g. Übung) 
    output = output.replace("Ü(?=[a-zäöüß ])", "Ue") 
        .replace("Ö(?=[a-zäöüß ])", "Oe") 
        .replace("Ä(?=[a-zäöüß ])", "Ae"); 

    //now replace all the other capital umlaute 
    output = output.replace("Ü", "UE") 
        .replace("Ö", "OE") 
        .replace("Ä", "AE"); 

    return output; 
} 

Source

+1

Bello, intelligente che si occupa di Ue/UE. ('o_str ...' tuttavia prude). Potresti voler utilizzare sostituire i.o. sostituisci tutto. –

+0

@JoopEggen: Incorporate i vostri suggerimenti, grazie. – user1438038

+1

Questo non funziona per me. Dopo aver usato questo metodo, la mia stringa non è cambiata affatto. Il ä è ancora lì. – user2841991

1

Ho appena provato a farlo funzionare e funziona benissimo.

Se non si utilizzano le espressioni regolari, utilizzare string.replace anziché string.replaceAll poiché è leggermente più veloce di quest'ultimo. La differenza tra loro consiste principalmente nel fatto che replaceAll può gestire regex. EDITORE: Ho appena notato che le persone nei commenti hanno detto la stessa cosa prima di me quindi se hai letto ci puoi quasi ignorare quello che ho detto, come indicato che il problema esiste altrove nel tuo codice mentre quello snippet funziona come previsto .

11

In primo luogo v'è un problema molto piccolo in Unicode:

  • ä potrebbe essere un punto di codice SMALL_LETTER_A_WITH_UMLAUT o due punti di codice: SMALL_LETTER_A seguiti da COMBINING_DIACRITICAL_MARK_UMLAUT.

Per questo è possibile normalizzare il testo Unicode.

s = Normalizer.normalize(s, Normalizer.Form.NFKC); 

I mezzi C compongono, e produrrebbe la versione compatta.

Il secondo problema, più prozaico, è che la codifica della sorgente java nell'editor deve essere la stessa utilizzata per il compilatore javac -encoding ....

È possibile verificare se la codifica è corretta utilizzando (test-saggio) l'u-fuga:

"\u00E4" // instead of ä 

La mia ipotesi è che questo potrebbe essere il problema. La norma internazionale sembra essere diventata UTF-8 per le origini e la compilazione java.

Inoltre è possibile utilizzare

result = result.replace(UMLAUT_REPLACEMENTS[i][0], UMLAUT_REPLACEMENTS[i][1]); 

senza regex sostituire, essere più veloce.

+0

Grazie per la risposta. La mia codifica sembra essere corretta. Se sto scrivendo "String test =" \ u00E4 ";" e faccio il debug di the String contiene il carattere "ä". Ma cos'è con la normalizzazione? L'ho usato prima di sostituire i personaggi, ma non cambia nulla finora. – user2841991

+1

In questo caso, con NKC/NFKC, sostituirebbe qualsiasi versione a due caratteri di 'ä' (normale latin-a più umlaut a larghezza zero) con un singolo carattere' ä'. La rappresentazione visiva non dovrebbe essere diversa, ma le stringhe hanno una lunghezza diversa. NKD/NFKD (decompose) può essere utilizzato per un ordinamento internazionale per lettera base, ponendo 'ĉ ...' dopo 'c ...' indipendentemente dalle impostazioni locali. –

+0

Non capisco. Lo voglio al contrario. Voglio sostituire ä con ae. Perché la rappresentazione visiva non è diversa? Questo è esattamente ciò di cui ho bisogno di cambiare, la rappresentazione. – user2841991

1

Funziona correttamente quando lo provo, quindi deve essere un problema di codifica.

Verificare la codifica del sistema. È possibile aggiungere -encoding UTF-8 alla riga di comando del compilatore javac.

 -encoding encoding 
     Set the source file encoding name, such as EUC-JP and UTF-8. If -encoding is not specified, the platform default converter is used. 
2

codifica Codifica ENCODING ....

diversa fonte di ingresso può causare complicazioni nella stringa di codifica. per esempio uno può avere UTF-8 codifica, mentre l'altro è ISO

alcune persone hanno suggerito che il codice funziona per loro, quindi, il suo più probabile che le stringhe che si codifica diversa mentre lavorate. (la codifica diversa risulta in un diverso array di byte senza alcuna sostituzione ...)

per risolvere il problema dalla sua radice, è necessario assicurarsi che ciascuna delle origini utilizzi esattamente la stessa codifica.

Prova questo esercizio e aiuta si spera di risolvere il problema:

1-provate questo:

System.out.println(Arrays.asList("Ä".getBytes()); //1 and 2 should have same results 
System.out.println(Arrays.asList(new String("Ä","UTF-8").getBytes()); //1 and 2 should have same results 
System.out.println(Arrays.asList(new String("Ä","UTF-32").getBytes()); //should have a different results from one and two 
System.out.println(Arrays.asList(orig.getBytes()); //look for representation and search for pattenr of numbers (this bit is the hard bit I guess). 
System.out.println(Arrays.asList(new String(orig,"UTF-32").getBytes()); //look for representation and search for pattenr of numbers (this bit is the hard bit I guess). 

il passo successivo è quello di vedere come si forma la stringa orgi. per esempio se avete ricevuto dal web, assicurarsi che il POST e il metodo GET stanno utilizzando la codifica preferita

EDIT 1:

provare questo:

{ { new String("Ä".getBytes(),"UTF-8"), "Ae" }, ... }; 

se questa non ha funzionato provare questo:

byte[] bytes = {-61,-124}; //byte representation of Ä in utf-8 
    String Ae = new String(bytes,"UTF-8"); 
    { { Ae, "Ae" }, ... }; //and do for the rest 
+0

Le prime due righe non hanno lo stesso risultato per me. – user2841991

+0

@ user2841991 quindi controlla la modifica, probabilmente risolverà il tuo problema – nafas

0

ho dovuto modificare la risposta di user1438038:

private static String replaceUmlaute(String output) { 
    String newString = output.replace("\u00fc", "ue") 
      .replace("\u00f6", "oe") 
      .replace("\u00e4", "ae") 
      .replace("\u00df", "ss") 
      .replaceAll("\u00dc(?=[a-z\u00e4\u00f6\u00fc\u00df ])", "Ue") 
      .replaceAll("\u00d6(?=[a-z\u00e4\u00f6\u00fc\u00df ])", "Oe") 
      .replaceAll("\u00c4(?=[a-z\u00e4\u00f6\u00fc\u00df ])", "Ae") 
      .replace("\u00dc", "UE") 
      .replace("\u00d6", "OE") 
      .replace("\u00c4", "AE"); 
    return newString; 
} 

Questo dovrebbe funzionare su qualsiasi piattaforma di destinazione (ho avuto problemi su un gatto su Windows).

Problemi correlati