googleappengine上的Java字符编码
我正在Google App Engine上运行一个GWT应用程序,它通过GWT-RPC/Servlet将GUI中的文本输入传递给API。但是像ä,ö,ü这样的umlauts被API误解了,API只显示了一个?而不是乌姆劳特 我很确定问题在于Google应用程序引擎上的默认字符编码,即US-ASCII:US-ASCII不知道任何umlaut 在本地机器上使用来自JUnit测试的带有API的umlauts。那里的默认字符编码是UTF-8 问题不来自GWT或任何HTML文件的编码;我在包含一些UMLAUT的应用程序中使用了一个常量Java字符串,并将其传递给API:如果应用程序部署在Google应用程序引擎中,问题就会出现 有没有办法改变谷歌应用程序引擎中的字符编码?或者有人知道我的问题的另一个解决方案吗 将GUI中的UMLAUT存储在GAE数据存储中,并将其带回GUI中,这非常有趣。解决方法(安全) 我编写这个类是为了使用googleappengine上的Java字符编码,java,google-app-engine,gwt,character-encoding,Java,Google App Engine,Gwt,Character Encoding,我正在Google App Engine上运行一个GWT应用程序,它通过GWT-RPC/Servlet将GUI中的文本输入传递给API。但是像ä,ö,ü这样的umlauts被API误解了,API只显示了一个?而不是乌姆劳特 我很确定问题在于Google应用程序引擎上的默认字符编码,即US-ASCII:US-ASCII不知道任何umlaut 在本地机器上使用来自JUnit测试的带有API的umlauts。那里的默认字符编码是UTF-8 问题不来自GWT或任何HTML文件的编码;我在包含一些UMLA
AsciiEncoder.encode(yourUtfString)
然后可以使用ascienceoder.decode(您的ascienceodedutfstring)
将字符串解码回UTF,其中支持UTF
package <your_package>;
import java.util.ArrayList;
/**
* Created by Micha F. aka Peracutor.
* 04.06.2017
*/
public class AsciiEncoder {
public static final char MARK = '%'; //use whatever ASCII-char you like (should be occurring not often in regular text)
public static String encode(String s) {
StringBuilder result = new StringBuilder(s.length() + 4 * 10); //buffer for 10 special characters (4 additional chars for every special char that gets replaced)
for (char c : s.toCharArray()) {
if ((int) c > 127 || c == MARK) {
result.append(MARK).append((int) c).append(MARK);
} else {
result.append(c);
}
}
return result.toString();
}
public static String decode(String s) {
int lastMark = -1;
ArrayList<Character> chars = new ArrayList<>();
try {
//noinspection InfiniteLoopStatement
while (true) {
String charString = s.substring(lastMark = s.indexOf(MARK, lastMark + 1) + 1, lastMark = s.indexOf(MARK, lastMark));
char c = (char) Integer.parseInt(charString);
chars.add(c);
}
} catch (IndexOutOfBoundsException | NumberFormatException ignored) {}
for (char c : chars) {
s = s.replace("" + MARK + ((int) c) + MARK, String.valueOf(c));
}
return s;
}
}
包;
导入java.util.ArrayList;
/**
*由Micha F.aka Perakator创作。
* 04.06.2017
*/
公共类电子订单{
public static final char MARK='%';//使用任意ASCII字符(在常规文本中不应经常出现)
公共静态字符串编码(字符串s){
StringBuilder结果=新的StringBuilder(s.length()+4*10);//10个特殊字符的缓冲区(每个被替换的特殊字符有4个额外字符)
for(char c:s.toCharArray()){
如果((int)c>127 | | c==标记){
结果.append(MARK).append((int)c).append(MARK);
}否则{
结果:追加(c);
}
}
返回result.toString();
}
公共静态字符串解码(字符串s){
int lastMark=-1;
ArrayList chars=新的ArrayList();
试一试{
//noinspection无穷远语句
while(true){
字符串charString=s.substring(lastMark=s.indexOf(MARK,lastMark+1)+1,lastMark=s.indexOf(MARK,lastMark));
char c=(char)Integer.parseInt(charString);
添加(c)项;
}
}catch(IndexOutOfBoundsException |忽略NumberFormatException){
for(char c:chars){
s=s.replace(“+MARK+((int)c)+MARK,String.valueOf(c));
}
返回s;
}
}
希望这对某人有所帮助。我也遇到了同样的问题:部署到Google App Engine的web应用程序的默认字符集设置为
US-ASCII
,但我需要它为UTF-8
经过一番深思熟虑,我发现:
<system-properties>
<property name="appengine.file.encoding" value="UTF-8" />
</system-properties>
toappengine web.xml
将字符集正确设置为UTF-8
。有关更多详细信息,请访问。如果您(像我一样)在Google AppEngine上使用Java,可以通过应用程序.yaml
设置file.encoding
系统属性(通过运行时自动拾取的代码)来“简单”修复默认编码,如下所示:
env_variables:
JAVA_USER_OPTS: -Dfile.encoding=UTF-8
不清楚“API只显示a”是什么意思-在哪里?理想情况下,您应该在每个阶段跟踪准确的数据,以准确地找出问题所在。请参阅听起来您需要控制输出的字符编码。有关更多详细信息,请参阅。@DanielTung我试图设置
和
,但都不起作用。@JonSkeet简言之:运行API.call(“testäü”)
将导致API(发送短信)从我的机器发送“testäü”,从GAE发送“test???”。@Andr Janus:这并不能真正帮助我们解决问题所在。它是什么API?你有文件吗?