You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit2与Moshi无法读取带重音字母问题求助

解决Retrofit2 + Moshi解析带重音字母乱码的问题

我之前也碰到过类似的特殊字符乱码问题,多半是字符编码处理不匹配导致的——像ü这类带重音的字符很容易因为编码解析错误变成�。咱们一步步来解决:

1. 先排查服务器响应头问题

先用Postman或者浏览器访问你的接口,查看响应的Content-Type头是否明确指定了charset=utf-8。正常的响应头应该是这样的:

Content-Type: application/json; charset=utf-8

如果服务器返回的Content-Type里没有charset=utf-8,那优先建议后端同学修改响应头,明确指定UTF-8编码,这是最根本的解决方式。

2. 强制OkHttp使用UTF-8解析响应

如果服务器没法修改响应头,那我们可以在OkHttp中添加一个拦截器,强制把响应内容按UTF-8编码解析,不管服务器怎么设置:

首先创建一个自定义拦截器:

class ForceUtf8Interceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val originalResponse = chain.proceed(chain.request())
        val originalBody = originalResponse.body ?: return originalResponse
        
        // 强制用UTF-8读取响应内容
        val utf8BodyString = originalBody.source().readString(Charset.forName("UTF-8"))
        val modifiedBody = ResponseBody.create(originalBody.contentType(), utf8BodyString)
        
        return originalResponse.newBuilder()
            .body(modifiedBody)
            .build()
    }
}

然后在提供OkHttpClient的代码中添加这个拦截器:

@Provides @Singleton fun provideOkHttpClient(): OkHttpClient {
    return OkHttpClient.Builder()
        .addInterceptor(ForceUtf8Interceptor()) // 加入强制UTF-8的拦截器
        // 这里可以保留你原本的其他配置,比如日志拦截器、超时设置等
        .build()
}

3. 确认Moshi配置无问题

你的Moshi配置里已经添加了自定义的SingleToArrayAdapter,这部分是没问题的——Moshi默认就是用UTF-8处理字符串解析的,所以不需要额外修改Moshi的Builder,只要确保OkHttp那边正确读取了响应内容即可。

做完上面的步骤后,再测试接口,带重音的字母应该就能正常解析显示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:05:24