Simple&Natural
[Android] HTML 문자열 Unescaping 방법 본문
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
'안드로이드(Android) > 이슈 및 해결' 카테고리의 다른 글
Kotlin-kapt & ButterKnife 동시 사용 시 null 오류 (0) | 2021.04.29 |
---|---|
2021-01-04 이슈 (Android Studio Build 관련 문제 해결) (0) | 2021.01.04 |
[Android] SQLITE 및 ROOM 환경에서 Join 쿼리 사용하기 (0) | 2020.11.30 |
[해결중] 네트워크 작업 요청 제한하기 (0) | 2020.11.08 |
Android Studio 4.0 실행 시 Start Failed Error 관련 (0) | 2020.11.02 |