2010-06-29 15 views
5

Sto costruendo un'app gwt che memorizza il testo di pagine Web casuali in un campo di testo del datastore. Spesso il testo è formattato in UTF-8. Tutti i file della mia app sono memorizzati come UTF-8 e quando eseguo l'applicazione sul mio computer locale l'intero processo funziona correttamente. Il testo UTF-8 è memorizzato come tale e recuperabile dalla versione locale del motore dell'app come UTF-8. Tuttavia, quando installo l'app sul motore dell'app google da qualche parte tra quando immagazzino il testo e quando lo recupero non è più UTF-8 che fa sì che i caratteri non ascii vengano visualizzati come?.Google App Engine DataStore Testo UTF-8 Problema di codifica

Quando visualizzo il datastore nel pannello di controllo appengine tutti i caratteri speciali vengono visualizzati come? che mi porta a credere che sia un problema quando si scrive al database.

Qualcuno sa come risolvere questo problema?

L'app in sé è un po 'grande. Ecco alcuni pseudocodice:

Text webPageText = new Text(<STRING THAT CONTAINS UNICODE CHARACTERS>); 

/*Some Code to store Text object on datastore 
Specifically I'm using javax.jdo.PersistenceManager to do this. 
Some Code to retrieve text from datastore. */ 

String retrievedText = webPageText.getValue(); 

Il problema è che retrievedText torna con? invece di caratteri unicode.

Ecco un problema simile in python che ho trovato: Trying to store Utf-8 data in datastore getting UnicodeEncodeError. Anche se la mia app non ha riscontrato errori.

Purtroppo penso che le stringhe Java siano predefinite in utf-8 e non riesco a trovare alcun codice che consenta di dichiararle esplicitamente come utf-8.

Modifica: ora ho creato una piccola webapp che accetta il testo unicode e lo memorizza nell'archivio dati e quindi lo recupera senza problemi. Non ho ancora idea di dove si trovi il problema nel mio codice sorgente originale, ma cambierò il modo in cui il mio codice gestisce il recupero delle pagine web in modo che corrisponda all'app più piccola che ho appena creato. Grazie a tutti per il vostro aiuto.

+0

Potrebbe pubblicare i bit di codice rilevanti? –

+0

Dici che pensi che il problema sia con la memorizzazione e il recupero, quindi non includere il codice che stai utilizzando per archiviare e recuperare i dati! Abbiamo bisogno del codice pertinente se vogliamo aiutarti. –

+0

La fonte per l'intero progetto è ora pubblicata sopra. Tra un paio d'ore cercherò di creare una versione ridotta che riproduca il problema. –

risposta

0
+0

Non conosco molto bene python ma non penso che siano proprio quelli che sto cercando. Servo solo una pagina Web che è anche UTF-8 e posso inviare testo UTF-8 tra il client e il server. L'unico problema si verifica solo quando il testo UTF-8 viene memorizzato/recuperato dall'archivio dati appengine. –

+0

La mia affermazione sopra potrebbe essere errata. Non sono sicuro di poter inviare il testo UTF-8 tra client e server appengine. Controllerà questo domani. –

1

ho provato a convertire la stringa di ByteArray e quindi memorizzare come archivio dati blob.

//Save String as Blob 
Blob webPageText = new Blob(<STRING THAT CONTAINS UNICODE CHARACTERS>.getBytes()); 

//Retrieve Blob as String 
String retrievedText = new String(webPageText.getBytes()); 

Ho inizialmente pensato che questo aveva risolto il problema ma ho avuto solo per errore testato sul mio server locale. Questo codice restituisce ancora? invece di caratteri unicode che mi portano a credere che il problema non si trovi nel datastore ma nel trasferimento dal motore dell'app al client.

+0

È un vero _answer_ alla tua domanda? Se è così, per favore accettalo. –

+0

Questo mi sta ancora perseguitando. Come hai risolto esattamente? –

3

Risolto lo stesso problema impostando la codifica di richiesta e risposta su utf-8. La codifica della richiesta produce una stringa valida memorizzata nell'archivio dati, senza i valori verranno memorizzati come "???? ..."

Richieste: se si utilizzano client HTTP Apache, questo è fatto nel modo seguente:

richiesta GET:

NameValuePair... params; 
... 
String url = urlBase + URLEncodedUtils.format(Arrays.asList(params), "UTF-8"); 
HttpGet httpGet = new HttpGet(url); 

Inserisci richiesta:

NameValuePair... params; 
... 
HttpPost httpPost = new HttpPost(url); 
httpPost.setEntity(new UrlEncodedFormEntity(Arrays.asList(params), "UTF-8")); 

Risposta: se si costruire la tua risposta in HttpServlet, questo è fatto in un modo seguente:

HttpServletResponse resp; 
... 
resp.setContentType("text/html; charset=utf-8"); 
1

codifica Soluzione: l'uso del browser Causa "8859_1" charset
=> Prima
Salva Datastore, ho convertire charset.

new String(req.getParameter("title").getBytes("8859_1"),"utf-8") 

Quando ho eseguito questa applicazione sul mio computer locale, andava bene. Ma quando ho schierato, ho affrontato lo stesso problema che hai visto. Ho risolto questo problema:

Dopo
=> Salva codice datastore.

new String(req.getParameter("title").getBytes("utf-8"),"utf-8") 
Problemi correlati