Simple&Natural

[Android] HTML 문자열 Unescaping 방법 본문

안드로이드(Android)/이슈 및 해결

[Android] HTML 문자열 Unescaping 방법

Essense 2020. 12. 15. 02:24
728x90

 

어떤 분이 API를 이용해 데이터를 긁어오시는데 문자열이 ♥ 와 같은 식으로 나온다고 고민하셨다.

찾아보니 해당 형식은 HTML에서 Escaping을 위해 사용되는 문자열로 웹브라우저가 아닌 곳에서 응답을 받으면

해당 문자열이 그대로 출력되는 것이다.

 

그냥 HTML 문서에 출력되는 모습으로 바꾼 뒤 보여주면 되는 부분이다.

다행히 안드로이드 스튜디오의 text API 에서 Html 클래스를 제공하고 있어서 이를 이용하면 Escaping 된 HTML 문자를 읽어낼 수 있다.

 

소스코드를 아래에 적어둔다.

 

class RetrofitUnitTest {

    companion object {
        const val BASE_URL = "http://sch.afreecatv.com/"
    }

    inline fun <reified T> testCreateRetrofitService(baseUrl: String): T = Retrofit.Builder()
        .addConverterFactory(ScalarsConverterFactory.create())
        .client(
            OkHttpClient().newBuilder()
                .connectTimeout(3000, TimeUnit.SECONDS)
                .readTimeout(3000, TimeUnit.SECONDS)
                .writeTimeout(3000, TimeUnit.SECONDS)
                .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS))
                .build()
        )
        .baseUrl(baseUrl)
        .build()
        .create(T::class.java)

    interface TestApi {
        @GET("api.php?m=liveSearch&v=1.0&szOrder=&c=UTF-8&szKeyword=%25EC%258B%259C%25EC%25A1%25B0%25EC%2583%2588&nPageNo=&nListCnt=20&hl=1&onlyParent=1")
        fun getSearchInfo() : Call<String>
    }

    @Test
    fun retrofitCallTest() {

        val api = testCreateRetrofitService<TestApi>(BASE_URL)
        val response = api.getSearchInfo()

        val maxLogSize = 1000
        var hasNext = true
        var page = 0
        response.execute().body()?.let { result ->
            while (hasNext) {
                page++
                if (result.length - maxLogSize*page < 0) {
                    val line = result.substring((page-1)*maxLogSize until result.length)
                    println(Html.fromHtml(line, Html.FROM_HTML_MODE_LEGACY))
                    hasNext = false
                } else {
                    val line = result.substring((page-1)*maxLogSize until page*maxLogSize)
                    println(Html.fromHtml(line, Html.FROM_HTML_MODE_LEGACY))
                }
            }

        } ?: println("응답없음")


    }

}
728x90