【问题标题】:App Engine Breaks EncodingApp Engine 中断编码
【发布时间】:2015-03-16 21:44:55
【问题描述】:

当我在本地部署后端并调用 apimethod(通过 url 或资源管理器)时,我会在 JSON 中收到这样的响应:

"pronunciations": [  {   
    "type": "ahd-legacy",   
    "pronunciation": "(rēˈstrə)"  
} ]

但是,第二次我将其部署到应用引擎并调用此方法(将对象存储在 objectify 中),然后以该对象格式将其发送回,我将其作为 JSON 接收:

"pronunciations": [  {
    "type": "ahd-legacy",
    "pronunciation": "(r����str��)"
} ]

我也尝试将字符串存储为 utf-8 字节(objectify 会自动转换为 base64,然后仍然转换为上述)

我是否应该专门标记某些东西以便正确存储?

【问题讨论】:

  • 这个问题与 Objectify 或数据存储无关。无论你交给 Objectify(以及数据存储)的 String 都是你得到的;没有进行 base-64 编码。如果您遇到编码问题,则需要在堆栈中查找更高的位置。

标签: json google-app-engine objectify


【解决方案1】:

我知道它是什么。从本地运行时它工作正常而在部署时不起作用的原因是,当我调用从端点接收某些东西时,它会自动使用服务器的编码,即 ASCII。如果你想让它工作,你需要像这样提出你的请求:

URL url = new URL(uri);
String response = new BufferedReader(
    new InputStreamReader(url.openStream(), "UTF-8")).readLine();

JSONParser jsonParser = new JSONParser();
return jsonParser.parse(response);

【讨论】:

    【解决方案2】:

    这可能不是存储问题,而更可能是您从/向网络接收/发送数据并对其进行编码/解码时的编码问题。

    GAE 生产服务器上的 JVM 设置为使用 US-ASCII 作为默认编码。在您的本地计算机上,它可能设置为 UTF-8。

    无论何时在字符串和字节数组之间进行转换,都应该始终明确地使用 UTF-8。

    【讨论】:

    • 嗯,我会尝试再搞砸一些。但是,我已经尝试在对象的 getter 和 setter 中使用 StringUtils getbytesutf8 和 newstringutf8 方法,所以我不确定我还能尝试什么。谢谢!
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2012-11-13
    • 2011-02-16
    • 2018-05-11
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多