You need to enable JavaScript to run this app. Android Kotlin Volley同时传文件和带emoji文本时emoji乱码如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin Volley同时传文件和带emoji文本时emoji乱码如何解决

问题产生原因
  • 普通StringRequest默认使用UTF-8编码传输POST参数,emoji这类Unicode字符可以正常编码解析。你使用的自定义VolleyFileUploadRequest类走multipart/form-data协议传输,默认未指定UTF-8编码,文本参数写入时用了ISO-8859-1或ASCII编码,超出编码范围的emoji字符会被错误转码为=)这类异常字符。
  • 该自定义类的文本参数未单独声明charset=utf-8的Content-Type,服务端解析multipart表单时默认用ASCII解码,也会导致emoji乱码。
修复方案

1. 修改文本参数写入逻辑

找到VolleyFileUploadRequest类中处理getParams()文本参数的代码块,将原有直接调用writeBytes的逻辑替换为指定UTF-8编码的字节写入逻辑,示例修改如下:

// 原有错误写法
// dos.writeBytes(value + "\r\n")

// 修改后写法
params.forEach { (key, value) ->
    dos.write("--$boundary\r\n".toByteArray(Charsets.UTF_8))
    dos.write("Content-Disposition: form-data; name=\"$key\"\r\n".toByteArray(Charsets.UTF_8))
    // 新增文本参数编码声明
    dos.write("Content-Type: text/plain; charset=utf-8\r\n\r\n".toByteArray(Charsets.UTF_8))
    dos.write(value.toByteArray(Charsets.UTF_8))
    dos.write("\r\n".toByteArray(Charsets.UTF_8))
}

2. 修改multipart整体编码声明

重写getBodyContentType方法,在返回值中指定整体编码为UTF-8:

override fun getBodyContentType(): String {
    return "multipart/form-data; boundary=$boundary; charset=utf-8"
}

3. 确认服务端解析配置

确保服务端解析multipart表单时使用UTF-8编码,避免服务端侧解码错误。

内容的提问来源于stack exchange,提问作者TheGreatCornholio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 15:27:03