Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
googleappengine上的Java字符编码_Java_Google App Engine_Gwt_Character Encoding - Fatal编程技术网

googleappengine上的Java字符编码

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

我正在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中,这非常有趣。

解决方法(安全) 我编写这个类是为了使用
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>

to
appengine 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?你有文件吗?