Gibt es eine Möglichkeit, die Verwendung von UTF-8 mit app engine?
Ich bin auf der Suche nach einer Erklärung, wie die app engine beschäftigt sich mit Zeichenkodierungen. Ich arbeite an einer client-server-Anwendung, wobei der server ist auf der app engine.
Dies ist eine neue Anwendung von Grund auf neu gebaut, so dass wir die Verwendung von UTF-8 überall. Der client sendet einige strings an den server über den POST -, x-www-form-urlencoded. Ich bekomme Sie und echo Sie wieder zurück. Wenn der client bekommt es zurück, es ist ISO-8859-1! Ich habe auch dieses Verhalten angezeigt, wenn Sie die Buchung in die blobstore, mit der die Parameter gesendet, die als UTF-8, multipart/form-data codiert.
Für das Protokoll, ich sehe das in Wireshark. Also ich bin mir 100% sicher, dass ich das senden von UTF-8 und erhalten ISO-8859-1. Auch ich bin nicht zu sehen, mojibake: die ISO-8859-1-kodierte strings sind völlig in Ordnung. Dies ist auch nicht ein Problem der Fehlinterpretation des Content-Type. Es ist nicht der client. Etwas auf dem Weg ist, richtig zu erkennen ich bin senden von UTF-8-Parameter, jedoch ist die Umwandlung in ISO-8859-1 aus irgendeinem Grund.
Ich bin zu der Annahme geführt, ISO-8859-1 ist die Standard-Zeichenkodierung für die GAE-servlets. Meine Frage ist, gibt es eine Möglichkeit zu sagen, GAE, nicht zu konvertieren, um ISO-8859-1 und stattdessen UTF-8 überall?
Lassen Sie uns sagen, dass das servlet nicht so etwas wie dieses:
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("application/json");
String name = req.getParameter("name");
String json = "{\"name\":\"" + name + "\"}";
resp.getOutputStream().print(json);
}
Ich habe versucht Einstellung der Kodierung der Antwort und Anfrage zu "UTF-8", aber das konnte nichts ändern.
Vielen Dank im Voraus,
- Ich weiß nicht, über GÄ, aber Ihre API sieht wie J2EE-Servlets. Gibt es ISO-8859-1 ist ja die Standardeinstellung. Verwenden
resp.setCharacterEncoding()
um die Codierung ändern oder print-Binär-Dateien direkt. - GAE verwendet, die gleiche API. Ich habe versucht, die Codierung des Zeichensatzes in der Antwort bereits, es funktioniert nicht. 🙁 Danke, aber.
- Ich habe nicht verwendet, appengine, sondern mit allen Anwendungsserver verwenden, musste ich einen filter implementieren, zu zwingen, die Codierung UTF-8 (wegen des 'Problems' Zeiss erwähnt...dumm servlet spec). Sie können kopieren Sie den filter aus tomcat wenn Sie nicht möchten, das Rad neu zu erfinden.
- Hast du dies gelesen? macgyverdev.blogspot.com.ar/2011/09/...
- Nein, habe ich nicht versuchen, dass. Die links, die ich gesehen habe nutzen Spring, ich bin nicht mit Spring. Dein link ist nicht geladen hier. Ich fand, dass der code woanders, ich werde give it a shot, und zurück zu dir, vielen Dank.
- Ja, es Spring verwendet. Ich bin nicht mit Spring.
- nur FTR, siehe die Antwort von leonboy. Es funktioniert nicht im SPIEL, offenbar. 🙁
- Hinweise für die Fehlersuche: was bedeutet
resp.getCharacterEncoding()
gibt ? (kurz vor derresp.getOutputStream()
). Setzen Sie die Zeichenkodierung, die nach dem Aufruf von setContentType und vor getOutputStream()? Was passiert, wenn statt getOutputStream (), die Sie verwenden getWriter() ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich zwei Dinge, die Sie tun sollten.
1) set system-Eigenschaften (falls Sie es sind) auf utf8 in Ihrem appengine-web.xml
OK, der oben ist, was ich habe, aber die docs legen nahe, dass diese unter:
https://developers.google.com/appengine/docs/java/config/appconfig
2) die Kodierung angeben, die, wenn Sie die Art des Inhalts, oder es wird wieder auf die Standardeinstellung
Ich würde versuchen
Könnten Sie auch versuchen, eine Schriftstellerin, mit der Sie die Art des Inhalts, um es direkt.
http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletResponse.html#getWriter%28%29
http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletResponse.html#setContentType(java.lang.String)
Für was es Wert ist, ich brauche utf8 Inhalte für Japanisch und ich habe keine Probleme. Ich bin nicht mit einem filter oder setContentType sowieso. Ich bin mit gwt und #1 oben und es funktioniert.
Einen Weg gefunden, das zu umgehen. Dies ist, wie ich es gemacht habe:
Verwendet "application/json; charset=UTF-8" als content-type. Alternativ können Sie die Antwort charset "UTF-8" (entweder wird funktionieren, keine Notwendigkeit, beides zu tun).
Base64-codierte der input-strings, die nicht-ASCII-sicher und kommen als UTF-8. Sonst werden Sie konvertiert werden, ISO-8859-1 wenn Sie zu dem servlet, offenbar.
Verwendet resp.getWriter() anstelle von resp.getOutputStream() zum drucken der JSON-Antwort.
Nach alle die Bedingungen wurden erfüllt, ich war schließlich in der Lage, die Ausgabe in UTF-8 an den client zurück.
Dies ist nicht spezifisch für GAE, aber wenn Sie es nützlich finden: ich habe meine eigenen filter:
In web.xml
(legen Sie die filter-mapping fragment ganz am Anfang der filter-mappings, und überprüfen Sie Ihre url-pattern.
Und
Workaround (safe)
Nichts von diesen Antworten, die für mich gearbeitet, also schrieb ich diese Klasse zu encode UTF-Strings zu ASCII-Strings (ersetzt alle chars, die nicht in der ASCII-Tabelle mit der entsprechenden Tabelle-Nummer, vorangestellt und gefolgt von einer mark), mit
AsciiEncoder.encode(yourString)
Den String können Sie dann decodiert zurück zu UTF mit
AsciiEncoder.decode(yourAsciiEncodedString)
.Hoffe, das jemand hilft.