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
相关产品推荐
相关产品推荐

