2010-06-29 9 views
5

Buduję aplikację gwt, która przechowuje tekst losowych stron w polu tekstowym magazynu danych. Często tekst jest sformatowany w UTF-8. Wszystkie pliki mojej aplikacji są przechowywane jako UTF-8, a po uruchomieniu aplikacji na komputerze lokalnym cały proces działa poprawnie. Tekst UTF-8 jest przechowywany jako taki i można go pobrać w lokalnej wersji silnika aplikacji jako UTF-8. Jednak kiedy wdrażam aplikację do silnika aplikacji Google gdzieś pomiędzy kiedy przechowuję tekst i kiedy go odzyskaję, to nie jest już UTF-8, który powoduje, że znaki spoza ASC są wyświetlane jako?.Google App Engine DataStore Tekst Kodowanie UTF-8 Problem

Kiedy wyświetlam datastore w panelu sterowania appengine, wszystkie znaki specjalne są wyświetlane jako? co prowadzi mnie do przekonania, że ​​jest to problem przy pisaniu do bazy danych.

Czy ktoś wie, jak to naprawić?

Sama aplikacja jest trochę za duża. Oto niektóre Pseudokod:

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(); 

Problemem jest to, że retrievedText wraca z? zamiast znaków Unicode.

Oto podobny problem w python, który znalazłem: Trying to store Utf-8 data in datastore getting UnicodeEncodeError. Chociaż moja aplikacja nie otrzymuje żadnych błędów.

Niestety uważam, że łańcuchy Java są domyślnymi utf-8 i nie mogę znaleźć żadnego kodu, który pozwoli mi zadeklarować je jawnie jako utf-8.

Edytuj: Zbudowałem małą aplikację webową, która pobiera tekst w unicode i zapisuje go w magazynie danych, a następnie pobiera go bez żadnych problemów. Wciąż nie mam pojęcia, gdzie jest problem z moim oryginalnym kodem źródłowym, ale zamierzam zmienić sposób, w jaki mój kod obsługuje pobieranie stron internetowych w celu dopasowania do mniejszej aplikacji, którą właśnie zbudowałem. Dziękuję wszystkim za waszą pomoc.

+0

Czy możesz opublikować odpowiednie fragmenty kodu? –

+0

Mówisz, że uważasz, że problem dotyczy przechowywania i pobierania, a następnie nie podawaj kodu, którego używasz do przechowywania i pobierania danych! Potrzebujemy odpowiedniego kodu, jeśli w ogóle mamy pomóc. –

+0

Źródło całego projektu znajduje się powyżej. Za kilka godzin postaram się zrobić małą wersję, która powiela problem. –

Odpowiedz

0
+0

Nie znam Pythona bardzo dobrze, ale nie sądzę, że są one tym, czego szukam. Obsługuję tylko jedną stronę internetową, która jest również UTF-8 i mogę wysyłać tekst UTF-8 między klientem a serwerem. Jedyny problem występuje tylko wtedy, gdy tekst UTF-8 jest przechowywany/pobierany z magazynu danych Appengine. –

+0

Moje powyższe stwierdzenie może być nieprawidłowe. Nie jestem pewien, czy mogę wysłać tekst UTF-8 między klientem a serwerem appengine. Sprawdzę to jutro. –

1

Próbowałem przekonwertować ciąg do ByteArray, a następnie zapisać go jako magazynu danych 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()); 

początkowo, że to nie rozwiązuje problemu, ale musiałem przez pomyłkę tylko testowałem to na moim lokalnym serwerem. Ten kod nadal się zwraca? zamiast znaków unicode, które prowadzą mnie do przekonania, że ​​problem nie występuje w magazynie danych, ale w przeniesieniu z silnika aplikacji do klienta.

+0

Czy to jest aktualny _odpowiedź_ na twoje pytanie? Jeśli tak, zaakceptuj to. –

+0

To wciąż mnie prześladuje. Jak dokładnie rozwiązałeś? –

3

Naprawiono ten sam problem, ustawiając zarówno kodowanie żądania, jak i odpowiedzi na utf-8. Żądanie kodowania powoduje przesłanie prawidłowego ciągu znaków przechowywanego w magazynie danych, bez jego wartości będą przechowywane jako "???? ..."

Wnioski: jeśli używasz klienta Apache HTTP, odbywa się to w następujący sposób:

zamówienie Pobierz:

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

ofertę kupna:

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

Response: Jeśli zbuduj swoją odpowiedź w HttpServlet, odbywa się to w następujący sposób:

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

Kodowanie Rozwiązanie: Ponieważ użycie Przeglądarka "8859_1" charset
=> Zanim
Zapisz magazynu danych, przekonwertować charset.

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

Po uruchomieniu tej aplikacji na komputerze lokalnym wszystko było w porządku. Ale kiedy wdrożyłem, stanąłem w obliczu tego samego problemu, który widziałeś. Rozwiązałem ten problem przez:

Po
=> Zapisz kod Datastore.

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