티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

Android. WebView and loadData

Android에서 WebView와 loadData

 문제 내용 

It's possible to use following method for content's setting of a web-view loadData(String data, String mimeType, String encoding)

웹뷰에서 컨텐츠를 설정할 때 다음과 같은 메소드를 사용할 수 있습니다. loadData(String data, String mimeType, String encoding)

 

How to handle the problem with unknown encoding of html data?!

HTML 데이터의 알 수 없는 인코딩 문제를 어떻게 처리해야 할까요?!

 

Is there a list of encodings?!

인코딩 목록이 있나요?!

 

I know from my college that in my case html comes from DB and is encoded with latin-1. I try to set encoding parameter to latin-1, to ISO-8859-1 / iso-8859-1, but still have problem with displaying of special signs like ä, ö, ü.

대학교에서 html이 데이터베이스(DB)에서 가져와 latin-1로 인코딩되었다는 것을 알고 있습니다. encoding 매개 변수를 latin-1, ISO-8859-1/iso-8859-1로 설정해보았지만, 여전히 ä, ö, ü와 같은 특수 문자가 표시되지 않는 문제가 있습니다.

 

I'll be very thankful for any advice.

어떤 조언이든 매우 감사하겠습니다.

 

 

 

 높은 점수를 받은 Solution 

myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);

This works flawlessly, especially on Android 4.0, which apparently ignores character encoding inside HTML.

이 방법은 아주 원활하게 작동하며, 특히 안드로이드 4.0에서는 HTML 내부의 문자 인코딩을 무시하는 것으로 알려져 있습니다.

 

Tested on 2.3 and 4.0.3.

2.3와 4.0.3에서 테스트되었습니다.

 

In fact, I have no idea about what other values besides "base64" does the last parameter take. Some Google examples put null in there.

사실, 마지막 매개변수에서 "base64" 외에 어떤 값들이 사용되는지 모르겠습니다. 구글 예제에서는 거기에 null을 넣었습니다.

 

 

 

 가장 최근 달린 Solution 

The safest way to load htmlContent in a Web view is to:

웹 뷰에 htmlContent를 안전하게 로드하는 가장 안전한 방법은 다음과 같습니다:

 

  1. use base64 encoding (official recommendation)
  2. specify UFT-8 for html content type, i.e., "text/html; charset=utf-8" instead of "text/html" (personal advice)
1. base64 인코딩을 사용합니다 (공식 권장 사항)
2. html 콘텐츠 타입으로 "text/html" 대신 "text/html; charset=utf-8"을 지정합니다 (개인적인 조언)

 

"Base64 encoding" is an official recommendation that has been written again (already present in Javadoc) in the latest 01/2019 bug in Chrominium (present in WebView M72 (72.0.3626.76)):

"Base64 인코딩"은 공식 권장사항으로, 최신 01/2019 버그인 Chrominium(WebView M72 (72.0.3626.76)에 존재)에서 다시 한번 작성되었습니다.

 

https://bugs.chromium.org/p/chromium/issues/detail?id=929083

(위 링크는 크롬 버그 관련 페이지입니다.)

 

Official statement from Chromium team:

크로미움 팀의 공식 발표:

 

"Recommended fix:
Our team recommends you encode data with Base64. We've provided examples for how to do so:

"권장하는 해결책: 저희 팀은 데이터를 Base64로 인코딩하는 것을 권장합니다. 이를 수행하는 방법에 대한 예시를 제공했습니다:"

 

API 문서: 비디오 토크: (9:58 타임 스탬프로 이동)

 

This fix is backwards compatible (it works on earlier WebView versions), and should also be future-proof (you won't hit future compatibility problems with respect to content encoding)."

이 수정은 하위 WebView 버전에서도 작동하며, 미래에 콘텐츠 인코딩과 관련된 호환성 문제가 발생하지 않도록 대비할 수 있습니다.

 

Code sample:

코드 샘플:
webView.loadData(
    Base64.encodeToString(
        htmlContent.getBytes(StandardCharsets.UTF_8),
        Base64.DEFAULT), // encode in Base64 encoded 
    "text/html; charset=utf-8", // utf-8 html content (personal recommendation)
    "base64"); // always use Base64 encoded data: NEVER PUT "utf-8" here (using base64 or not): This is wrong! 

 

 

출처 : https://stackoverflow.com/questions/3961589/android-webview-and-loaddata

반응형
댓글
공지사항
최근에 올라온 글