Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di Ceras
    Registrato dal
    Oct 2009
    Messaggi
    141

    Fare una query di inserimento di testi con caratteri greci

    Salve a tutti, premetto che sto sviluppando un progetto web-based utilizzando GWT come framework e Oracle come dbms.

    Nel progetto si prevede l'inserimento del database di testi anche in greco, qualcosa del tipo:
    τὸ μὲν γὰρ τῆς τροφῆς πρῶτον, τὸ δὲ τῶν ἐλευθέρων. ὥστε δέοι ἂν τὰ περὶ τὴν τῆς γυναικὸς ὁμιλίαν οἰκονομήσασθαι καλῶς: τοῦτο δέ ἐστι τὸ ποίαν τινὰ δεῖ ταύτην εἶναι παρασκευάσαι.
    Purtroppo ho dei problemi nell'inserimento nel db di questo tipo di testo. Guardando nel db i dati vengono completamente trasformati in qualcosa come "p¿s¿¿ ¿st¿¿"!

    Se inserisco manualmente un testo di questo tipo nella tabella (con sql developer che è un tool come phpmyadmin), va tutto bene: facendo la query di selezione mi vengono visualizzati i caratteri correttamente. Quindi oracle gestisce questo tipo di caratteri.

    Inoltre dalla textbox (che per comodità è una rich text format box) il testo viene prelevato correttamente: ho fatto un esempio in cui si prende il contenuto di una textbox come String e la si mette in un'altra textbox e i caratteri funzionano bene. Quindi anche Java gestisce questo tipo di caratteri.

    Ho concluso che l'unico problema è quando invio la stringa della query: credo che in qualche modo la stringa venga convertita da String (16 bit unicode) a char (8 bit)... insomma il problema sembra esserci prima ancora di eseguire la query, cioè quando viene inviata la stringa della query.

    Come risolvere il problema?

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

    Re: Fare una query di inserimento di testi con caratteri greci

    Originariamente inviato da Ceras
    Nel progetto si prevede l'inserimento del database di testi anche in greco

    Ho concluso che l'unico problema è quando invio la stringa della query: credo che in qualche modo la stringa venga convertita da String (16 bit unicode) a char (8 bit)... insomma il problema sembra esserci prima ancora di eseguire la query, cioè quando viene inviata la stringa della query.
    Immagino che a livello di String Java il testo sia correttamente codificato. Fin qui non ci dovrebbero essere problemi (perché se ce ne fossero, bisognerebbe vedere da dove/come arriva la stringa!).

    Il secondo punto è come fai la query, cioè direttamente con JDBC? Sarebbe appropriato usare un PreparedStatement e assegnare la stringa in modo "parametrico", così almeno non si avrebbero "grane" nella composizione effettiva della query.

    Il terzo punto è il DB ed è qui presumibilmente il nocciolo del problema. Qui entra in gioco il charset, che può essere associato in modo specifico ad un campo, alla tabella o più globalmente al database. Dipende quale è questo charset .... potrebbe essere il latin1 (ISO-8859-1), UTF-8 o altro. Qualunque sia deve permettere di codificare i caratteri greci.

    Se il problema è questo .... Java non centra nulla, devi verificare la configurazione della base dati ed eventualmente modificarla.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Ceras
    Registrato dal
    Oct 2009
    Messaggi
    141

    Re: Re: Fare una query di inserimento di testi con caratteri greci

    Originariamente inviato da andbin
    Immagino che a livello di String Java il testo sia correttamente codificato. Fin qui non ci dovrebbero essere problemi (perché se ce ne fossero, bisognerebbe vedere da dove/come arriva la stringa!).

    Il secondo punto è come fai la query, cioè direttamente con JDBC? Sarebbe appropriato usare un PreparedStatement e assegnare la stringa in modo "parametrico", così almeno non si avrebbero "grane" nella composizione effettiva della query.

    Il terzo punto è il DB ed è qui presumibilmente il nocciolo del problema. Qui entra in gioco il charset, che può essere associato in modo specifico ad un campo, alla tabella o più globalmente al database. Dipende quale è questo charset .... potrebbe essere il latin1 (ISO-8859-1), UTF-8 o altro. Qualunque sia deve permettere di codificare i caratteri greci.

    Se il problema è questo .... Java non centra nulla, devi verificare la configurazione della base dati ed eventualmente modificarla.
    Sì, la query (almeno per ora) la gestisco in modo semplice, col metodo Statement.execute(String query). Non credo c'entri troppo il db, in quanto inserendo i dati via sqldeveloper (cioè facendo copia e incolla del testo greco dal sw sqldeveloper), i testi sono corretti e riesco anche a prelevarli correttamente.

    Di più: se inserisco questa query:
    codice:
    stmt.execute("insert into passi(testo_originale) values('\u611b') ")
    Cioè inviando direttamente il codice unicode del carattere "愛", questo viene correttamente inserito!

  4. #4
    Hai provato ad eseguire una query inserendo direttamente il carattere, in questo modo ?
    codice:
    stmt.execute("insert into passi(testo_originale) values('愛') ")
    E' quello che dovrebbe avvenire quando, a quanto ho capito, concateni la stringa
    codice:
    "stmt.execute("insert into passi(testo_originale) values('" + text + "') ")"
    Comunque si usa PreparedStatement per le query parametrizzate come ha detto andbin
    lolide
    Java Programmer

    Informati

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

    Re: Re: Re: Fare una query di inserimento di testi con caratteri greci

    Originariamente inviato da Ceras
    Non credo c'entri troppo il db
    Di più: se inserisco questa query:
    codice:
    stmt.execute("insert into passi(testo_originale) values('\u611b') ")
    Cioè inviando direttamente il codice unicode del carattere "愛", questo viene correttamente inserito!
    Se è così ... ok, vuol dire che a livello di DB il charset è già appropriato.

    C'è un'altra questione che non ho pensato di precisare subito. Tu dici che vedi cose tipo "p¿s¿¿ ¿st¿¿" .... ma dove le vedi? Non è solo questione di Java e di DB!! Ma anche di quale è l'ambiente che dovrebbe visualizzare il testo, es. "console" (prompt dei comandi) o pagina web/browser o altro, quale/i charset tratta l'ambiente e visualizzando i caratteri con quale font di carattere.

    E come puoi immaginare la questione dei charset è meno banale di quanto credi ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Ceras
    Registrato dal
    Oct 2009
    Messaggi
    141
    Grazie per le pronte risposte

    Innanzitutto mi scuso perché ho visto male: anche facendo così
    codice:
    stmt.execute("insert into passi(testo_originale) values('\u611b') ")
    Il carattere risultante viene perso e vedo questo carattere "¿".

    Mi spiego meglio su "dove" lo vedo: precisamente, vedo il carattere sia quando apro la tabella con sqldeveloper (nel campo in cui ho inserito il carattere), sia quando carico e mostro la riga nel software.

    Posto qualche screenshot per mostrare meglio il problema:


    Questa è la mia tabella PASSI (id, nome_originale, ...), faccio notare che:

    - le righe con id 102 e 64 le ho inserite da java, e come si vede i caratteri sono alterati. Sottolineo che ho provato sia ad inserirle facendo copia e incolla su una textarea rtf che inserendola direttamente nella query (utilizzando \uXXXX).
    La riga 102 è proprio quella che corrisponde al carattere 愛.

    - le righe con id 63 e 66 le ho inserite direttamente dall'interfaccia di sqldeveloper (facendo copia e incolla), e si vedono correttamente

    Questa invece è la schermata demo del sw in cui si mostra il risultato della query in un panel:


    Si nota subito che i dati vengono visualizzati esattamente come si vedono su sqldeveloper.

    Continuo a pensare che non sia un problema implicito del db, altrimenti non dovrei proprio riuscire ad inserire tali caratteri, nemmeno con sqldeveloper.

    Insomma la selezione funziona correttamente, ma non l'inserimento...
    Provo un po' a giocare con il prepared statement, e vi faccio sapere

  7. #7
    Utente di HTML.it L'avatar di Ceras
    Registrato dal
    Oct 2009
    Messaggi
    141
    Niente, non va

    Questo è il codice che ho applicato:
    codice:
    	Connection conn = openConnection();
    	String query = "insert into PASSI (testo_originale) values (?)";
    	PreparedStatement prepStat = conn.prepareStatement(query);
    	prepStat.setString(1, testoOriginale);
    	prepStat.executeUpdate();
    	closeConnection(conn);
    Il risultato è lo stesso: se la stringa testoOriginale contiene caratteri come "πάντες ἄνθρωποι τοῦ", nel database ci andrà a finire "p¿¿te¿_¿¿¿¿¿p¿¿_t¿¿"

    Suggerimenti?

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    41
    Ciao, è solo una idea non son sicuro che possa risolvere, ma credo che il porblema possa essere nell'encoding delle info che ricevi dalla textarea.

    Non ho mai usato GWT quindi non so come settare l'encoding dell'html che genri nella tua web app, ma dovresti cercare di usare lo stesso encoding che usi nel database per esser sicuro.

    Java non modifica l'encoding di una stringa a meno che non sia tu a farlo manualmente.

  9. #9
    Utente di HTML.it L'avatar di Ceras
    Registrato dal
    Oct 2009
    Messaggi
    141
    Originariamente inviato da Cl4Ba
    Ciao, è solo una idea non son sicuro che possa risolvere, ma credo che il porblema possa essere nell'encoding delle info che ricevi dalla textarea.

    Non ho mai usato GWT quindi non so come settare l'encoding dell'html che genri nella tua web app, ma dovresti cercare di usare lo stesso encoding che usi nel database per esser sicuro.

    Java non modifica l'encoding di una stringa a meno che non sia tu a farlo manualmente.
    purtroppo il problema c'è anche se la query non la ricavo dalla textarea, cioè se faccio:
    String query = "insert into PASSI (testo_originale) values ('πάντες ἄνθρωποι τοῦ').

    Non solo, ho il problema anche se uso i caratteri di escape.
    A me sembra che il problema sia a livello di jdbc, ma non so come risolverlo...

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    41
    allora il problema sta nel formato del file del codice java sorgente. IO ho avuto grossi problemi a validate 'ÿ' maiuscolo (per un sito finlandese) e alla fine ho dovuto rinunciare, poichè quel carattere non è parte dello standard UTF8 ma UTF16 e non potevo modificare l'encoding dei sorgenti.

    Il tuo problema è probabilmente che il formato in cui salvi il sorgente è diverso da quello del db per cui succede che la stringa in java viene codificata nello stesso formato del file sorgente che è diverso da quello del db. Stessa cosa succede se usi UTF8 escape e il db è in un altro formato. Jdbc scrive il char nel formato in cui lo riceve (utf8 o non so cosa) e lo scrive nel db oracle dove tu hai configurato il charset giusto per contenere i caratteri greci.

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.