改装自动解析 html unicode

Retrofit auto parse html unicode

我有问题。我有一个json。我正在尝试解析 '\u00e7 等符号。符号 \u00e7 成功解析,但符号 ' 保持不变。这是我的改造建造者。

Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .baseUrl(RatersApi.BASE_URL)
        .client(get())
        .build()
        .create(RatersApi::class.java)

以及从 get() 函数调用的 ok http 构建器

OkHttpClient.Builder()
        .addInterceptor(HttpLoggingInterceptor()
            .apply { level = HttpLoggingInterceptor.Level.BODY }
        )
        .addInterceptor(HeaderInterceptor())
        .build()

回答

好的。我没有找到正确的解决方案,所以我编写了自己的拦截器,它从 html 转换字符串。只需将其注入您的 okhttp 构建器即可:

class HtmlStringInterceptor: Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val response = chain.proceed(chain.request())

        val contentType = response.body?.contentType()
        val bodyString = if (android.os.Build.VERSION.SDK_INT >= 24) {
            Html.fromHtml(response.body?.string(), Html.FROM_HTML_MODE_COMPACT).toString()
        } else {
            Html.fromHtml(response.body?.string()).toString()
        }

        val body = bodyString.toResponseBody(contentType)
        return response.newBuilder().body(body).build()
    }
}

此问题的原因已在您的标题中:' 是 HTML 代码而不是 Unicode。

所以 JSON 解析是正确的,您需要额外的处理来处理 HTML 内容。例如,如果你想在 TextView 中显示它,你可以使用以下内容:

// extension function to handle different api levels 
fun TextView.setHtml(htmlContent: String) {
    if (android.os.Build.VERSION.SDK_INT >= 24) {
        this.text = Html.fromHtml(htmlContent, Html.FROM_HTML_MODE_COMPACT)
    } else {
        @Suppress("DEPRECATION")
        this.text = Html.fromHtml(htmlContent)
    }
}

// set view content from JSON 
text_view.setHtml("test: '")