将带有 UTF-8 的字符从 Android 应用程序发送到服务器端

Posted

技术标签:

【中文标题】将带有 UTF-8 的字符从 Android 应用程序发送到服务器端【英文标题】:Send character with UTF-8 from Android app to server side 【发布时间】:2020-08-25 16:30:00 【问题描述】:

我有一些带有以下标头的服务,我想在 android 应用程序中调用这些方法。我为调用服务编写了以下代码是正确的,但如果我在标题中添加charset=utf-8,我会得到 400 错误代码。我应该以某些方法发送波斯字符,如果没有UTF-8,我会在服务器端收到不正确的字符。无论如何,请发送您的建议以编辑我的代码。

另一个注意事项:我使用 PostMan 并将波斯字符发布到服务中,它显示正确的字符。

WCF 标头方法:

     OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
        UriTemplate = "Test")]

安卓代码:

         this.jsonStringer=params[0].toString();
            HttpPost request = new HttpPost(uri);
            request.setHeader("Accept", "application/json");
            request.setHeader("Content-type", "application/json");
            StringEntity msg = new StringEntity(jsonStringer);
            msg.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
                    "application/json"));
            msg.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                    "application/json"));
            request.setEntity(msg);
            response = httpClient.execute(request);

当我添加 request.setHeader("Content-type", "application/json; charset=utf-8"); 时,我得到 400 错误代码!

【问题讨论】:

【参考方案1】:

标头参数默认为 UTF8,但如果您尝试通过将参数放在正文中来传递参数,则应执行以下操作。

假设您已将非 utf8 字符串存储在 value1 中。首先使用 URLEncoder 将您的字符串转换为 utf8,然后将其添加到您的 jsonObject 并将其转换为正文。

这是一个示例代码,但在 Kotlin 中!

val jsonObject = JSONObject()
jsonObject.put(“param1”,val1)
val val1 = URLEncoder.encode(value1,”utf8”)
jsonObject.put(“param2”,val2) // and so on
val body = jsonObject.toString().toRequestBody(“application/json; charset=utf-8”.toMediaTypeOrNull())

重要通知

确保您的字符串不是 urf8,因为除非您从 ANSI txt 文件中读取它,否则它们是 Unicode,您不需要转换它们。如果您在服务器上没有看到应有的结果,那就是另一个问题了。

【讨论】:

【参考方案2】:

这可能是你在request中设置的header和你在basicheader中设置的header不同造成的。你可以将它们的content-type设置为相同的格式。Java中的这个设置可以解决这个问题,你可以在你的程序中尝试一下。

     public static void main(String args[]) throws ClientProtocolException, IOException  

     String json="\"user\":\"Email\":\"123\",\"Name\":\"sdd\",\"Password\":\"sad\"";
     CloseableHttpClient httpClient=HttpClientBuilder.create().build();
     HttpPost request = new HttpPost("http://localhost:8012/ServiceModelSamples/service/web/user");
     request.setHeader("Accept", "application/json");

     request.setHeader("Content-Type", "application/json;charset=utf-8");

     StringEntity msg = new StringEntity(json);
     msg.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
           "application/json;charset=utf-8"));
     msg.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
           "application/json"));
     request.setEntity(msg);
     HttpResponse response = httpClient.execute(request); 
     System.out.println(response); 
     

【讨论】:

以上是关于将带有 UTF-8 的字符从 Android 应用程序发送到服务器端的主要内容,如果未能解决你的问题,请参考以下文章

将文本字符串从 android 应用程序发送到网站上的表单?

JavaMail 从字符串发送邮件附件 - 编码 UTF-8

Android JSON CharSet UTF-8 问题

如何将包含撇号的字符串传递给android中的查询?

Android JSON CharSet UTF-8问题

Android:我们可以在应用程序运行时创建带有字符串的位图吗?