Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    378

    [java/tomcat] codifica caratteri utf8 differente da windows e linux

    Salve,
    stò lavorando per un progetto universitario e mi sono imbattuto in un problema che non riesco a risolvere, sono stato tutta la nottata a sbatterci la testa provando tutte le alternative che sono riuscito a trovare in rete ma con pochi risultati.

    Il progetto si basa su un'applicazione client/server con server tomcat, uso delle richieste ajax tramite la classe BuilderRequest di GWT che implementra richieste di tipo REST, e le risposte dall'altra parte mi vengono fornite da alcune Servlet.

    Il problema si presenta solo quando vado a caricare online il progetto su macchine che montano tomcat su sistemi linux, mentre in locale ho preferito lavorare con tomcat su windows.

    Il problema in pratica consiste in una errata codifica sulla parte server, dunque sulle servlet, e si presenta con caratteri particolari del tipo *α, β* che nelle richieste vengono convertiti in esadecimale tipo: %C1%B6 (esempio g. servlet?char=%C1%B6)


    questi parametri dovrebbero essere passati al processore saxon che dovrebbe processare alcuni xml tramite dei fogli xslt, ma dato che questi parametri di input hanno una codifica errata, non mi vengono restituiti i risultati aspettati.

    la soluzione che funziona *solo su windows* è quella di convertire il carattere in utf8 in questo modo:

    codice:
    Byte[] b= null;
    String inputChar =  request.getParameter("carattere");
    b = inputChar.getBytes();
    ByteArrayOutputStream ris = new ByteArrayOutputStream();
    ris.write(b);
    inputChar = test.toString("utf-8");
    ho provato anche a codificare con varie classi che implementavano metodi per fare *encode e decode* degli uri ma senza nessun risultato.

    qualcuno ha qualche consiglio da propormi?

    grazie mille

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    indubbiamente è un problema legato a charset e code page sui vari computer locali. Ti devi porre tu il problema di come un carattere viene codificato quando parli di un carattere particolare come l'alfa o il beta.

    Qui trovi i caratteri direttamente supportati da java

    http://download.oracle.com/javase/6/...t/Charset.html

    per altri tipi di caratteri devi essere sicuro di avere la mappatura su ogni macchina che esegue.
    Per il futuro ti consiglio di evitare caratteri speciali (puoi scrivere alfa, si capisce comunque quello a cui ti riferisci) oppure ricordarti di utilizzare il charset in modo corretto

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    378
    Originariamente inviato da valia
    indubbiamente è un problema legato a charset e code page sui vari computer locali. Ti devi porre tu il problema di come un carattere viene codificato quando parli di un carattere particolare come l'alfa o il beta.

    Qui trovi i caratteri direttamente supportati da java

    http://download.oracle.com/javase/6/...t/Charset.html

    per altri tipi di caratteri devi essere sicuro di avere la mappatura su ogni macchina che esegue.
    Per il futuro ti consiglio di evitare caratteri speciali (puoi scrivere alfa, si capisce comunque quello a cui ti riferisci) oppure ricordarti di utilizzare il charset in modo corretto

    per la questione di alfa o beta è impossibile far quello che dici, dato che è un'applicazione che riguarda trascrizioni di testi antichi per filologi

    comunque non potevo avere accesso alle macchine linux per controllare la configurazione di tomcat, dato che io ho solo accesso come utente semplice.

    comunque alla fine ho risolto utilizzando questa funzione che ho trovato online:
    codice:
    private static String unescape(String s) { StringBuffer sbuf = new StringBuffer () ; int l = s.length() ; int ch = -1 ; int b, sumb = 0; for (int i = 0, more = -1 ; i < l ; i++) { /* Get next byte b from URL segment s */ switch (ch = s.charAt(i)) { case '%': ch = s.charAt (++i) ; int hb = (Character.isDigit ((char) ch) ? ch - '0' : 10+Character.toLowerCase((char) ch) - 'a') & 0xF ; ch = s.charAt (++i) ; int lb = (Character.isDigit ((char) ch) ? ch - '0' : 10+Character.toLowerCase ((char) ch)-'a') & 0xF ; b = (hb << 4) | lb ; break ; case '+': b = ' ' ; break ; default: b = ch ; } /* Decode byte b as UTF-8, sumb collects incomplete chars */ if ((b & 0xc0) == 0x80) { // 10xxxxxx (continuation byte) sumb = (sumb << 6) | (b & 0x3f) ; // Add 6 bits to sumb if (--more == 0) sbuf.append((char) sumb) ; // Add char to sbuf } else if ((b & 0x80) == 0x00) { // 0xxxxxxx (yields 7 bits) sbuf.append((char) b) ; // Store in sbuf } else if ((b & 0xe0) == 0xc0) { // 110xxxxx (yields 5 bits) sumb = b & 0x1f; more = 1; // Expect 1 more byte } else if ((b & 0xf0) == 0xe0) { // 1110xxxx (yields 4 bits) sumb = b & 0x0f; more = 2; // Expect 2 more bytes } else if ((b & 0xf8) == 0xf0) { // 11110xxx (yields 3 bits) sumb = b & 0x07; more = 3; // Expect 3 more bytes } else if ((b & 0xfc) == 0xf8) { // 111110xx (yields 2 bits) sumb = b & 0x03; more = 4; // Expect 4 more bytes } else /*if ((b & 0xfe) == 0xfc)*/ { // 1111110x (yields 1 bit) sumb = b & 0x01; more = 5; // Expect 5 more bytes } /* We don't test if the UTF-8 encoding is well-formed */ } return sbuf.toString() ; }

    grazie comunque per la risposta.

    ciao

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.