기계적 인조 인간. WebView 및 loadData mimeType, String encoding)의 콘텐츠 설정을

web-view loadData (String data, String mimeType, String encoding)의 콘텐츠 설정을 위해 다음과 같은 방법을 사용할 수 있습니다.

HTML 데이터의 알 수없는 인코딩 문제를 처리하는 방법?!

인코딩 목록이 있습니까?!

내 경우에는 html이 DB에서 왔고 latin-1로 인코딩되어 있다는 것을 대학에서 알고 있습니다. 인코딩 매개 변수를 latin-1, ISO-8859-1 / iso-8859-1로 설정하려고하지만 여전히 ä, ö, ü와 같은 특수 기호를 표시하는 데 문제가 있습니다.

조언을 해주셔서 감사합니다.



답변

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

이것은 특히 HTML 내부의 문자 인코딩을 무시하는 Android 4.0에서 완벽하게 작동합니다 .

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

사실, “base64″이외의 다른 값이 마지막 매개 변수를 취하는 지에 대해서는 전혀 모릅니다. 일부 Google 예제는 거기에 null을 넣습니다.


답변

WebView.loadData ()가 전혀 제대로 작동하지 않습니다. 내가해야 할 일은 :

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");

귀하의 경우 헤더와 WebView.loadData () 모두에서 UTF-8을 latin1 또는 ISO-8859-1로 바꿔야한다고 생각합니다.

그리고 완전한 답변을 제공하기 위해 다음은 공식 인코딩 목록입니다. http://www.iana.org/assignments/character-sets

더 포괄적으로 답변을 업데이트합니다.

Latin1 이 아닌 인코딩으로 WebView.loadData () 를 사용하려면 HTML 콘텐츠를 인코딩해야합니다. 이전 예제는 Android 4 이상에서 올바르게 작동하지 않았으므로 다음과 같이 수정했습니다.

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    String base64 = Base64.encodeToString(htmlString.getBytes(), Base64.DEFAULT);
    myWebView.loadData(base64, "text/html; charset=utf-8", "base64");
} else {
    String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
    myWebView.loadData(header + htmlString, "text/html; charset=UTF-8", null);

}

그러나 나중에 WebView.loadDataWithBaseURL ()으로 전환 했고 코드는 Android 버전에 의존하지 않고 매우 깨끗해졌습니다.

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null);

어떤 이유로 이러한 기능은 완전히 다른 구현을 가지고 있습니다.


답변

내가 이해했듯이 loadData()단순히 data:데이터가 제공 하는 URL을 생성 합니다.

다음에 대한 javadocs 를 읽으십시오 loadData().

인코딩 매개 변수의 값이 ‘base64’인 경우 데이터는 base64로 인코딩되어야합니다. 그렇지 않으면 데이터는 안전한 URL 문자 범위 내의 옥텟에 대해 ASCII 인코딩을 사용하고 해당 범위를 벗어난 옥텟에 대한 URL의 표준 % xx 16 진 인코딩을 사용해야합니다. 예 : ‘#’, ‘%’, ‘\’, ‘?’ 각각 % 23, % 25, ​​% 27, % 3f로 바꿔야합니다.

이 방법으로 형성된 ‘데이터’스키마 URL은 기본 US-ASCII 문자 집합을 사용합니다. 다른 문자 세트를 설정해야하는 경우 URL의 미디어 유형 부분에 문자 세트 매개 변수를 명시 적으로 지정하는 ‘데이터’스키마 URL을 형성하고 대신 loadUrl (String)을 호출해야합니다. 데이터 URL의 미디어 유형 부분에서 얻은 문자 집합은 항상 HTML 또는 XML 문서 자체에 지정된 문자 집합을 재정의합니다.

따라서 US-ASCII를 사용하고 특수 문자를 직접 이스케이프하거나 Base64를 사용하여 모든 것을 인코딩해야합니다. UTF-8을 사용한다고 가정하면 다음이 작동합니다 (latin1로 테스트하지 않았습니다).

String data = ...;  // the html data
String base64 = android.util.Base64.encodeToString(data.getBytes("UTF-8"), android.util.Base64.DEFAULT);
webView.loadData(base64, "text/html; charset=utf-8", "base64");


답변

이 문제가 있지만 :

String content = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
content += mydata + "</body></html>";
WebView1.loadData(content, "text/html", "UTF-8");

모든 장치에서 작동하지 않습니다. 그리고 몇 가지 방법을 병합합니다.

String content =
       "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+
       "<html><head>"+
       "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"+
       "</head><body>";

content += myContent + "</body></html>";

WebView WebView1 = (WebView) findViewById(R.id.webView1);
WebView1.loadData(content, "text/html; charset=utf-8", "UTF-8");

효과가있다.


답변

이것을 사용하십시오 : String customHtml = text;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);


답변

 String strWebData="html...." //**Your html string**

 WebView webDetail=(WebView) findViewById(R.id.webView1);

 WebSettings websetting = webDetail.getSettings();

 websetting.setDefaultTextEncodingName("utf-8");

 webDetail.loadData(strWebData, "text/html; charset=utf-8", null);


답변

웹보기에서 htmlContent를로드 하는 가장 안전한 방법은 다음과 같습니다.

  1. base64 인코딩 사용 (공식 권장 사항)
  2. html 컨텐츠 유형에 대해 UFT-8을 지정하십시오 (예 : “text / html”(개인 조언) 대신 “text / html; charset = utf-8”).

“Base64 인코딩”은 Chrominium최신 01/2019 버그 (WebView M72 (72.0.3626.76)에 있음 )에서 다시 작성된 공식 권장 사항입니다 (이미 Javadoc에 있음).

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

Chromium 팀의 공식 성명 :

“권장 수정 :
우리 팀은 Base64로 데이터를 인코딩 할 것을 권장합니다.이를 수행하는 방법에 대한 예제를 제공했습니다.

이 수정 사항은 이전 버전과 호환되며 (이전 WebView 버전에서 작동 함) 미래에도 보장되어야합니다 (콘텐츠 인코딩과 관련하여 향후 호환성 문제가 발생하지 않을 것입니다). “

코드 샘플 :

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!