Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Java] Caratteri fonetici su JTextField

    Salve ragazzi sono incappato in un problema da una settimana circa e non riesco a venirne a capo,spero che qualcuno possa aiutarmi.

    Ho un file con estensione .txt contenente il codice UNICODE di caratteri sia grammaticali sia fonetici.
    Per esempio bi:
    codice:
    \u0062\u0069\u003A
    il quale è la fonetica di be (verbo essere inglese)...

    Il problema è che se dichiaro l'oggetto
    codice:
    JTextField jtf1=new JTextField("\u0062\u0069\u003A");
    viene visualizzato bi: ed è giusto.
    Quando invece leggo la riga del file, la salvo su una variabile String e poi la passo settanto il testo alla JTextField mi visualizza \u0062\u0069\u003A nel campo.

    I metodi che utilizzo per la lettura del file sono FileReader e BufferedReader.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: [Java] Caratteri fonetici su JTextField

    Originariamente inviato da Matto1992
    Salve ragazzi sono incappato in un problema da una settimana circa e non riesco a venirne a capo,spero che qualcuno possa aiutarmi.

    Ho un file con estensione .txt contenente il codice UNICODE di caratteri sia grammaticali sia fonetici.
    Per esempio bi:
    codice:
    \u0062\u0069\u003A
    il quale è la fonetica di be (verbo essere inglese)...

    Il problema è che se dichiaro l'oggetto
    codice:
    JTextField jtf1=new JTextField("\u0062\u0069\u003A");
    viene visualizzato bi: ed è giusto.
    Quando invece leggo la riga del file, la salvo su una variabile String e poi la passo settanto il testo alla JTextField mi visualizza \u0062\u0069\u003A nel campo.

    I metodi che utilizzo per la lettura del file sono FileReader e BufferedReader.
    Beh è normale, se scrivi su file \u0062\u0069\u003A da un editor di testo lui scrive il carattere \, il carattere u, lo 0 ecc... interpretandoli singolarmente.

    Se il formato del file è quello che hai scritto, il metodo più semplice che ho provato (e funziona) è:
    • usare un BufferedReader e una struttura dati dinamica di caratteri (ad esempio ArrayList);
    • creare uno StringTokenizer per dividere la linea letta da file usando come delimitatore "\\u", escludendolo dai token;
    • a questo punto ogni token sarà un numero esadecimale rappresentante il carattere, quindi converti il token (che è una String) in intero teneno conto della base esadecimale, casti in maniera esplicita l'intero a char e lo metti nella struttura dinamica che hai creato prima.


    Qualcosa del genere:

    codice:
    import java.io.*;
    import java.util.*;
    
    class Test {
    
    	public static void main(String[] args)
    		throws IOException {
    
    		BufferedReader reader =	new BufferedReader(
    			new FileReader("Testo.txt"));
    		ArrayList<Character> characters= new ArrayList<>();
    		StringTokenizer tokenizer =
    			new StringTokenizer(reader.readLine(), "\\u", false);
    
    		while (tokenizer.hasMoreTokens())
    			characters.add(new Character(
    				(char) Integer.parseInt(tokenizer.nextToken(), 16)));
    
    		reader.close();
    	}
    
    }
    Catturando ovviamente le dovute eccezioni.
    Se invece lo vuoi un po' più "generale" va ovviamente cambiato qualcosa, questo funziona per il "formato" da te descritto.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Caratteri fonetici su JTextField

    Originariamente inviato da Matto1992
    codice:
    JTextField jtf1=new JTextField("\u0062\u0069\u003A");
    viene visualizzato bi: ed è giusto.
    Ovvio e noto. Il compilatore Java riconosce e tratta gli escape Unicode presenti nel sorgente. E non solo nelle stringhe letterali ma .... tecnicamente in tutto il sorgente! E lo fa ad un livello più "a monte" rispetto alla tokenizzazione del sorgente secondo la grammatica Java.

    Giusto per fare un esempio, si potrebbe scrivere nel sorgente:

    \u0069\u0066 (a == 2) { }

    che viene riconosciuto dal compilatore esattamente come

    if (a == 2) { }

    Originariamente inviato da Matto1992
    Quando invece leggo la riga del file, la salvo su una variabile String e poi la passo settanto il testo alla JTextField mi visualizza \u0062\u0069\u003A nel campo.
    Ovvio anche questo, quello che legge dal file .... è quello che viene poi visualizzato pari pari! Non c'è alcuna "interpretazione" particolare dei caratteri. Questo riconoscimento e trattamento degli escape devi farlo tu se vuoi questa cosa. Se vuoi farlo con del tuo codice, il modo più semplice e pulito per farlo è tramite l'uso delle espressioni regolari.

    codice:
    import java.util.regex.*;
    
    public class UnicodeUnescape {
        public static void main(String[] args) {
            // array di caratteri, solo per rendere chiaro l'input!
            char[] caratteri = {
                'A',                             // "A"
                '\\', '\\',                      // "\" (escape \\ )
                'B',                             // "B"
                '\\', 'u', '0', '0', '4', '3',   // "C" (escape Unicode \u0043 )
                'D'                              // "D"
            };
    
            String input = new String(caratteri);
    
            System.out.println(input);      // stampa A\\B\u0043D
    
            String output = unicodeUnescape(input);
    
            System.out.println(output);     // stampa A\BCD
        }
    
        public static String unicodeUnescape(String escaped) {
            Pattern p = Pattern.compile("\\\\(\\\\|u\\p{XDigit}{4})");
            Matcher m = p.matcher(escaped);
    
            StringBuffer buf = new StringBuffer();
    
            while (m.find()) {
                String group1 = m.group(1);    // quello catturato da ( ) nel Pattern
    
                if (group1.equals("\\")) {
                    // escape di '\'
                    m.appendReplacement(buf, "\\\\");
                } else {
                    // escape Unicode
                    String hexStr = group1.substring(1);
                    int hex = Integer.parseInt(hexStr, 16);
                    m.appendReplacement(buf, String.valueOf((char) hex));
                }
            }
    
            m.appendTail(buf);
            return buf.toString();
        }
    }
    P.S. qui sul forum non si vedono correttamente gli escape di \ . Guardate il sorgente prendendolo dal testo che quotereste in risposta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Ok ringrazio a tutti e due per la risposta dettagliata che mi avete fornito ma ho optato per la soluzione di andbin, ho preso il metodo da te scritto e gli ho passato pari pari la stringa letta e funziona benissimo!
    Grazie Matto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.