在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符(ë ä ï)

Posted

技术标签:

【中文标题】在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符(ë ä ï)【英文标题】:Sending special characters (ë ä ï) in POST body with DataOutputStream in Android 【发布时间】:2012-11-18 11:22:11 【问题描述】:

我目前正在开发一个具有大量服务器端通信的 android 应用程序。昨天我收到一个错误报告,说用户无法发送(简单)特殊字符,例如 ëäï。

我搜索了但没有找到任何有用的信息 可能重复(没有答案): https://***.com/questions/12388974/android-httpurlconnection-post-special-charactes-to-rest-clint-in-android

我的相关代码:

public void execute(String method) 
        HttpsURLConnection urlConnection = null;
        try 
            URL url = new URL(this.url);
            urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setRequestMethod(method);
            urlConnection.setReadTimeout(30 * 1000);
            urlConnection.setDoInput(true);

            if (secure)
                urlConnection.setRequestProperty("Authorization", "Basic " + getCredentials());

            if (body != null) 
                urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");


                urlConnection.setFixedLengthStreamingMode(body.length());
                urlConnection.setDoOutput(true);
                DataOutputStream dos = new DataOutputStream(urlConnection.getOutputStream());
                dos.writeBytes(body);
                dos.flush();
                dos.close();
            

            responseCode = urlConnection.getResponseCode();
            message = urlConnection.getResponseMessage();

            InputStream in = null;

            try 
                in = new BufferedInputStream(urlConnection.getInputStream(), 2048);
             catch (Exception e) 
                in = new BufferedInputStream(urlConnection.getErrorStream(), 2048);
            

            if (in != null)
                response = convertStreamToString(in);

         catch (UnknownHostException no_con) 
            responseCode = 101;
        catch (ConnectException no_con_2)
            responseCode = 101;
        catch(IOException io_ex)
            if(io_ex.getMessage().contains("No authentication challenges found"))
                responseCode = 401;
            else
                responseCode = 101;
         catch (Exception e) 
            e.printStackTrace();
         finally 
            if (urlConnection != null)
                urlConnection.disconnect();
        
    

body 是一个字符串 ;-)

希望我们能一起解决这个问题

更新:

试过了:


writeUTF()

需要一个能够理解修改后的 UTF-8 的服务器


byte[] buf = body.getBytes("UTF-8");
dos.write(buf, 0, buf.length);

字符串有效,但没有特殊字符

更新:得到它使用 StringEntity(* string, "UTF-8") 然后将结果解析为 byte[] 并使用 dos.write(byte[]) 写入它!

--

【问题讨论】:

阅读 writeBytes 文档。请改用 writeUTF。 听起来确实很公平。我如何获得该字符串的长度。我现在在指定错误长度时遇到错误 这是有道理的,因为有些字符是在几个字节上编码的。您可以尝试不指定长度,您可以使用 writeChars(但效率较低,因为所有字符都是 2 字节),您可以使用 String.getBytes("UTF-8").length(但这会创建一个相当长无用的字节[])。另外,请注意 DataOutputStream.writeUTF 是一种自定义格式,它在开头添加字符串的长度,旨在由 DataInputStream 读取。 (但这取决于您的服务器) 是的,我没有指定长度就让它工作了。但是服务器不是Java,不识别writeUTF修改的UTF编码。还有其他想法吗? 也试过 byte[] buf = body.getBytes("UTF-8"); dos.write(buf, 0, buf.length);但是特殊字符仍然不起作用 【参考方案1】:

设置 StringEntity 的编码对我有用:

StringEntity entity = new StringEntity(body, "UTF-8");

在这里看到:https://***.com/a/5819465/570168

【讨论】:

StringEntity entity = new StringEntity(body, "UTF-8"); 1) wr.writeBytes(entity.toString()); 2) wr.writeUTF(entity.toString());我尝试了两种方式,但不起作用。提前致谢。【参考方案2】:

我不完全确定是否为您的情况购买试用此实用程序 URLEncoder.encode(string, "UTF-8")

【讨论】:

【参考方案3】:

我在传递带有特殊字符 (ñ) 的 json 时在 android 中遇到了这个问题。 在我的 WebApi 方法中,[FromBody] 参数为 null,似乎无法解析 json。

我通过将字节获取为 UTF-8 然后将其写入 DataOutputStream(客户端修复)来使其工作。

byte[] b = jsonString.getBytes("UTF-8");
os.write(b, 0, b.length);

【讨论】:

以上是关于在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符(ë ä ï)的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Android 中使用 RxJava,何时使用 Android 架构组件中的 LiveData?

在 Android 12 中使用 WorkManager

如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?

如何在Mac中使用Android SDK

在 Android 中使用 Intent 在活动中传递 android 位图数据

无法在 Android 中使用 Android Crop 图像裁剪库