我有一个关于Android中OkHttp及其支持字符编码的问题,特别是如何使用UTF-8来支持瑞典字符 å、ä 和 ö(以及大写字母ÅÄÖ)。
我们正在构建的应用程序使用OkHttp向服务器系统发出GET和POST调用。服务器在Apache后面运行Tomcat。 Apache和Tomcat都默认配置为使用UTF-8字符编码。我认为所需的是从Android应用程序发送到服务器的http请求需要装备一个头部包含类似于“application/text; charset=utf-8”的内容。
我编写了这个简化的代码示例来说明这个问题。正如您所看到的,我已经在请求中添加了addHeader()来设置标题。 我还在RequestBody上积极设置了Charset。
public static String testPost() throws IOException{
OkHttpClient okHttpClient = new OkHttpClient();
HttpUrl.Builder builder = new HttpUrl.Builder();
HttpUrl httpUrl = builder.scheme("https")
.host("dev.ourdomainname.com")
.addPathSegment("characterencoding")
.build();
Charset charset = Charset.forName(StandardCharsets.UTF_8.name());
RequestBody requestBody = new FormBody.Builder(charset)
.add("text", "xxåäöÅÄÖxx")
.build();
Request request = new Request.Builder()
.url(httpUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Response response = okHttpClient.newCall(request).execute();
return "test completed";
}
在服务器端,我记录了名为text的参数的值,它以"xxåäöÃ?Ã?Ã?xx"的形式传入,显然这是不够好的。我还有一些代码,可以循环遍历请求中的所有头,并将它们记录下来。输出结果如下所示。请注意,没有"application/text; charset=utf-8"头。
DEBUG 23 Jan 14:52:37.128 - testCharacterEncoding. text: xxåäö���xx
DEBUG 23 Jan 14:52:37.129 - Header: content-type with value: application/x-www-form-urlencoded
DEBUG 23 Jan 14:52:37.129 - Header: content-length with value: 45
DEBUG 23 Jan 14:52:37.129 - Header: host with value: dev.cqrify.com
DEBUG 23 Jan 14:52:37.129 - Header: connection with value: Keep-Alive
DEBUG 23 Jan 14:52:37.129 - Header: accept-encoding with value: gzip
DEBUG 23 Jan 14:52:37.129 - Header: user-agent with value: okhttp/3.9.1
所以我的问题是:我们这样做错了吗?如果是的话,正确的方式是什么?最坏的情况是,这可能是OkHttp中的一个错误,但我怀疑。
为了比较,我建立了一个简单的HTML表单来进行完全相同的发布,通过这种方式发送的相同字符串为“xxåäöÅÄÖxx”,这是正确的。
.addHeader("Content-Type", "application/json; charset=utf-8")
与Header: content-type with value: application/x-www-form-urlencoded
不匹配。请详细说明。 - greenapps.add("text", "xxåäöÅÄÖxx")
是否没有被正确编译,可能是因为编码不受支持?你可以尝试使用System.out.println打印一下,看看它是否能够正常输出——也许这个GitHub 示例可以帮到你? - JGlass