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

