HTML 문자열을 표시 할 수 없습니다.


99

Android WebView에서 표시 문자열 HTML로 어려움을 겪고 있습니다.

서버 측에서 웹 페이지를 다운로드하고 HTML 문자와 따옴표를 이스케이프 처리했습니다 (Python 사용).

my_string = html.escape(my_string, True)

Android 클라이언트 측에서 : 문자열은 다음과 같이 이스케이프되지 않습니다.

myString = StringEscapeUtils.unescapeHtml4(myString)
webview.loadData( myString, "text/html", "encoding");

그러나 webview는 리터럴 문자열로 표시합니다. 결과는 다음과 같습니다.

여기에 이미지 설명 입력

편집 : 서버 측에서 반환 된 원래 문자열을 추가합니다.

link rel = "apple-touch-icon & quot; 크기 = & quot; 114x114 & quot; href = & quot; /static/favicon/apple-touch-icon-114x114.png" & gt; & lt; link rel = & quot; apple-touch-icon & quot; 크기 = "72x72" href = & quot; /static/favicon/apple-touch-icon-72x72.png" & gt; & lt; link rel = & quot; apple-touch-icon & quot; 크기 = "144x144" href = & quot; /static/favicon/apple-touch-icon-144x144.png" & gt; & lt; link rel = & quot; apple-touch-icon & quot; 크기 = "60x60" href = & quot; /static/favicon/apple-touch-icon-60x60.png" & gt; & lt; link rel = & quot; apple-touch-icon & quot; 크기 = & quot; 120x120 & quot; href = & quot; /static/favicon/apple-touch-icon-120x120.png" & gt; & lt; 링크 rel = & quot; 애플 터치 아이콘 & quot; 크기 = & quot; 76x76 & quot; href = & quot; /static/favicon/apple-touch-icon-76x76.png" & gt; & lt; link rel = & quot; apple-touch-icon & quot; 크기 = "152x152" href = & quot; /static/favicon/apple-touch-icon-152x152.png" & gt; & lt; link rel = & quot; apple-touch-icon & quot; 크기 = & quot; 180x180 & quot; href = & quot; /static/favicon/apple-touch-icon-180x180.png" & gt; & lt; link rel = & quot; 아이콘 & quot; type = & quot; 이미지 / png & quot; href = & quot; /static/favicon/favicon-192x192.png" 크기 = "192x192"& gt; & lt; link rel = & quot; 아이콘 & quot; type = & quot; 이미지 / png & quot; href = & quot; /static/favicon/favicon-160x160.png" 크기 = "160x160"& gt; & lt; 링크 rel = & quot; 아이콘 & quot; type = & quot; 이미지 / png & quot; href = & quot; /static/favicon/favicon-96x96.png" 크기 = & quot; 96x96 & quot; & gt; & lt; link rel = & quot; 아이콘 & quot; type = & quot; 이미지 / png & quot; href = & quot; /static/favicon/favicon-16x16.png" 크기 = "16x16"& gt; & lt; link rel = & quot; 아이콘 & quot; type = & quot; 이미지 / png & quot; href = & quot; /static/favicon/favicon-32x32.png" 크기 = "32x32"& gt; & lt; 메타 이름 = & quot; msapplication-TileColor & quot; content = & quot; # da532c & quot; & gt; & lt; 메타 이름 = & quot; msapplication-TileImage & quot; content = "/ static / favicon / mstile-144x144.png"& gt; & lt; 메타 이름 = & quot; msapplication-config & quot; content = & quot; /static/favicon/browserconfig.xml" & gt; & lt;!-외부 CSS-& gt; & lt; link rel = & quot; 스타일 시트 & quot; href = & quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css& quot; & gt; & lt;!-외부 글꼴-& gt; & lt; link href = & quot; // maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel = & quot; 스타일 시트 & quot; & gt; & lt; link href = & # x27; // fonts.googleapis.com/css?family=Open+Sans:300,600' rel = & # x27; 스타일 시트 & # x27; type = & # x27; text / css & # x27; & gt; & lt; link href = & # x27; // fonts.googleapis.com/css?family=Lora:400,700' rel = & # x27; 스타일 시트 & # x27; type = & # x27; text / css & # x27; & gt; & lt;!-[IE 9 인 경우] & gt; & lt; script src = & quot; // cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script> & lt; script src = "// cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> & lt ;! [endif]-& gt; & lt;!-사이트 CSS-& gt; & lt; link rel = & quot; 스타일 시트 & quot; type = & quot; 텍스트 / css & quot; href = & quot; /static/css/style.css" & gt; & lt; link rel = & quot; 스타일 시트 & quot; type = & quot; 텍스트 / css & quot; href = & quot; /static/css/glyphicon.css" & gt; & lt; / 헤드 & gt; & lt; 본문 & gt; & lt; div class = & quot; 컨테이너 기사 페이지 & quot; & gt; & lt; div class = & quot; 행 & quot; & gt; & lt; div 클래스 = "col-md-8 col-md-offset-2"& gt; & lt; h2 & gt; & lt; a href = & quot; quot; href = & quot; /static/css/glyphicon.css" & gt; & lt; / 헤드 & gt; & lt; 본문 & gt; & lt; div class = & quot; 컨테이너 기사 페이지 & quot; & gt; & lt; div class = & quot; 행 & quot; & gt; & lt; div 클래스 = "col-md-8 col-md-offset-2"& gt; & lt; h2 & gt; & lt; a href = & quot; quot; href = & quot; /static/css/glyphicon.css" & gt; & lt; / 헤드 & gt; & lt; 본문 & gt; & lt; div class = & quot; 컨테이너 기사 페이지 & quot; & gt; & lt; div class = & quot; 행 & quot; & gt; & lt; div 클래스 = "col-md-8 col-md-offset-2"& gt; & lt; h2 & gt; & lt; a href = & quot;http://www.huffingtonpost.com/2015/03/22/ted-cruz-climate-change_n_6919002.html & quot; & gt; Gov. Jerry Brown은 Ted Cruz가 & amp; # 39; 절대적으로 부적합합니다 & amp; # 39; 기후 변화로 인한 사무실 출마 & lt; / a & gt; & lt; / h2 & gt; & lt; h4 & gt; 샘 레빈 & lt; / h4 & gt; & lt; div class = & quot; article & quot; & gt; & lt; p & gt; 캘리포니아 주지사 제리 브라운 (D)은 일요일에 텍사스 ​​상원 의원 테드 크루즈 (R- 텍사스)가 "직접 출마하기에 절대적으로 부적합하다"고 말했다. 기후 변화에 대한 그의 입장 때문입니다. & lt; / p & gt; & lt; p & gt; & quot; 저는 사방에 눈과 얼음이있는 뉴햄프셔에서 방금 돌아 왔습니다. 이것에 대한 나의 견해는 간단합니다. 이것에 대한 토론은 과학을 따라야하고 데이터를 따라야하며 지구 온난화에 대한 많은 경고 주의자들은 과학이 뒷받침하지 않기 때문에 문제가 있습니다. 크루즈 & lt; a href = & quot;https://www.youtube.com/watch?v=m0UJ_Sc0Udk & quot; & gt; said & lt; / a & gt; & quot; Seth Meyers의 심야 & quot; 지난주. & lt; / p & gt; & lt; p & gt; 그의 주장을 뒷받침하기 위해 Cruz는 지난 17 년 동안 상당한 온난화가 부족한 위성 데이터를 인용했습니다. 그러나 Cruz의 추론 & lt; a href = & quot; http://www.politifact.com/truth-o-meter/statements/2015/mar/20 / ted-cruz / ted-cruzs-worlds-fire-not-last-17-years / & quot; & gt; 과학자들은 기후가 계속해서 따뜻해질 것이라고 믿을 수있는 충분한 증거를 가지고 있음을 보여주는 Politifact & lt; / a & gt;에 의해 반박되었습니다. & lt; / p & gt; & lt; p & gt; & quot; 그가 말한 것은 절대적으로 거짓입니다. "Brown은 & lt; a href = & quot; http : //www.nbcnews. unfit-be-running-n328046 "& gt; NBC & # x27; s"Meet the Press. "& lt; / a & gt; 그는 & lt; a href = & quot; http://climate.nasa.gov/scientific-consensus/ & quot; & gt; 90 % 이상 & lt; / a & gt; 기후를 연구하는 과학자 중 상당수는 기후 변화가 인간 활동에 기인한다는 데 동의합니다. '그 사람은 그러한 수준의 무지와 기존 과학 데이터의 직접적인 위조를 낳았습니다. 그것은 충격적이며, 나는 남자가 자신을 사무실에 출마하기에 절대적으로 부적합하게 만들었다 고 생각합니다. & quot; 브라운이 말했다. & lt; / p & gt; & lt; p & gt; Brown은 기후 변화에 & lt; a href = & quot; http://www.huffingtonpost.com/2015/03/06/california-drought-february- record_n_6820704.html? utm_hp_ref = california-drought & quot; & gt; 그의 주에서 가뭄을 일으켰고 & lt; / a & gt; 동해안에서 심한 추위와 폭풍을 일으켰습니다. & lt; / p & gt; & lt; p & gt; 크루스는 뉴햄프셔의 모든 곳에서 눈과 얼음을 보았을 지 모르지만, 데이터에 따르면이 나라는 실제로 & lt; a href = & quot; http://www.huffingtonpost.com/2015/02/19/cold-weather- winter_n_6713104.html & quot; & gt; 평균보다 따뜻함 & lt; / a & gt; 겨울. & lt; / p & gt; & lt; p & gt; Brown의 Cruz에 대한 비판은 텍사스 상원 의원이 & lt; a href = & quot; http://www.huffingtonpost.com/2015/03/22 /ted-cruz-2016_n_6917824.html"> 대통령 캠페인 & lt; / a & gt ;. & lt; / p & gt; & lt; / div & gt; & lt; div class = & quot; 원본 & quot; & gt; & lt; a href = & quot;http://www.huffingtonpost.com/2015/03/22/ted-cruz-climate-change_n_6919002.html& quot; & gt; 원본보기 & lt; / a & gt; & lt; / div & gt; & lt; / div & gt; & lt; / div & gt; & lt; / div & gt; & lt; script src = & quot; // code.jquery.com/jquery-latest.js"></script> & lt; 스크립트 src = & quot; /static/js/modal.js" & gt; & lt; / script & gt; & lt; script src = & quot; /static/js/bootbox.min.js> & lt; / script & gt; & lt; 스크립트 src = & quot; /static/js/site.js" & gt; & lt; / script & gt; & lt; 스크립트 & gt; (function (i, s, o, g, r, a, m) {i [& # x27; GoogleAnalyticsObject & # x27;] = r; i [r] = i [r] || function () {(i [ r] .q = i [r] .q || []). push (arguments)}, i [r] .l = 1 * new Date (); a = s.createElement (o), m = s. getElementsByTagName (o) [0]; a.async = 1; a.src = g; m.parentNode.insertBefore (a, m)}) (window, document, & # x27; script & # x27;, & # x27; // www. google-analytics.com/analytics.js','ga'); ga (& # x27; 만들기 & # x27 ;, & # x27; UA-56257533-1 & # x27 ;, & # x27; 자동 & # x27;); ga (& # x27; 보내기 & # x27 ;, & # x27; 페이지 뷰 & # x27;); & lt; / 스크립트 & gt; & lt; / 본문 & gt; & lt; / html & gt; "


디버깅 도움을 요청하는 질문 ( "이 코드가 작동하지 않는 이유")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. " 최소하고 재현 가능한 예제를 만드는 방법 "을 참조하십시오 .
틴 맨

답변:


55

여기에서 코드를 수정했습니다.

public class test extends Activity {
    private WebView wv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
        wv = (WebView) findViewById(R.id.wv);
        String s = "&lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt; &lt;meta name=&quot;description&quot; content=&quot;&quot;&gt; &lt;title&gt;Saulify&lt;/title&gt; &lt;!-- All the Favicons... --&gt; &lt;link rel=&quot;shortcut icon&quot; href=&quot;/static/favicon/favicon.ico&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;57x57&quot; href=&quot;/static/favicon/apple-touch-icon-57x57.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;114x114&quot; href=&quot;/static/favicon/apple-touch-icon-114x114.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;72x72&quot; href=&quot;/static/favicon/apple-touch-icon-72x72.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;144x144&quot; href=&quot;/static/favicon/apple-touch-icon-144x144.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;60x60&quot; href=&quot;/static/favicon/apple-touch-icon-60x60.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;120x120&quot; href=&quot;/static/favicon/apple-touch-icon-120x120.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;76x76&quot; href=&quot;/static/favicon/apple-touch-icon-76x76.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;152x152&quot; href=&quot;/static/favicon/apple-touch-icon-152x152.png&quot;&gt; &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;180x180&quot; href=&quot;/static/favicon/apple-touch-icon-180x180.png&quot;&gt; &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; href=&quot;/static/favicon/favicon-192x192.png&quot; sizes=&quot;192x192&quot;&gt; &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; href=&quot;/static/favicon/favicon-160x160.png&quot; sizes=&quot;160x160&quot;&gt; &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; href=&quot;/static/favicon/favicon-96x96.png&quot; sizes=&quot;96x96&quot;&gt; &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; href=&quot;/static/favicon/favicon-16x16.png&quot; sizes=&quot;16x16&quot;&gt; &lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; href=&quot;/static/favicon/favicon-32x32.png&quot; sizes=&quot;32x32&quot;&gt; &lt;meta name=&quot;msapplication-TileColor&quot; content=&quot;#da532c&quot;&gt; &lt;meta name=&quot;msapplication-TileImage&quot; content=&quot;/static/favicon/mstile-144x144.png&quot;&gt; &lt;meta name=&quot;msapplication-config&quot; content=&quot;/static/favicon/browserconfig.xml&quot;&gt; &lt;!-- External CSS --&gt; &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;&gt; &lt;!-- External Fonts --&gt; &lt;link href=&quot;//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css&quot; rel=&quot;stylesheet&quot;&gt; &lt;link href=&#x27;//fonts.googleapis.com/css?family=Open+Sans:300,600&#x27; rel=&#x27;stylesheet&#x27; type=&#x27;text/css&#x27;&gt; &lt;link href=&#x27;//fonts.googleapis.com/css?family=Lora:400,700&#x27; rel=&#x27;stylesheet&#x27; type=&#x27;text/css&#x27;&gt; &lt;!--[if lt IE 9]&gt; &lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js&quot;&gt;&lt;/script&gt; &lt;script src=&quot;//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js&quot;&gt;&lt;/script&gt; &lt;![endif]--&gt; &lt;!-- Site CSS --&gt; &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/static/css/style.css&quot;&gt; &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/static/css/glyphicon.css&quot;&gt; &lt;/head&gt; &lt;body&gt; &lt;div class=&quot;container article-page&quot;&gt; &lt;div class=&quot;row&quot;&gt; &lt;div class=&quot;col-md-8 col-md-offset-2&quot;&gt; &lt;h2&gt;&lt;a href=&quot;http://www.huffingtonpost.com/2015/03/22/ted-cruz-climate-change_n_6919002.html&quot;&gt;Gov. Jerry Brown Says Ted Cruz Is &amp;#39;Absolutely Unfit&amp;#39; To Run For Office Because Of Climate Change Views&lt;/a&gt;&lt;/h2&gt; &lt;h4&gt;Sam Levine&lt;/h4&gt; &lt;div class=&quot;article&quot;&gt; &lt;p&gt;California Gov. Jerry Brown (D) said on Sunday that Texas Sen. Ted Cruz (R-Texas) is &quot;absolutely unfit to be running for office&quot; because of his position on climate change.&lt;/p&gt; &lt;p&gt;&quot;I just came back from New Hampshire, where there&#x27;s snow and ice everywhere. My view on this is simple: Debates on this should follow science and should follow data, and many of the alarmists on global warming, they have a problem because the science doesn&#x27;t back them up,&quot; Cruz &lt;a href=&quot;https://www.youtube.com/watch?v=m0UJ_Sc0Udk&quot;&gt;said&lt;/a&gt; on &quot;Late Night with Seth Meyers&quot; last week.&lt;/p&gt; &lt;p&gt;To back up his claim, Cruz cited satellite data that has shown a lack of significant warming over the last 17 years. But Cruz&#x27;s reasoning &lt;a href=&quot;http://www.politifact.com/truth-o-meter/statements/2015/mar/20 /ted-cruz/ted-cruzs-worlds-fire-not-last-17-years/&quot;&gt;has been debunked by Politifact&lt;/a&gt;, which has shown that scientists have ample evidence to believe that the climate will continue to warm.&lt;/p&gt; &lt;p&gt;&quot;What he said is absolutely false,” Brown said on &lt;a href=&quot;http://www.nbcnews.com/meet-the-press/california-governor-ted-cruz- unfit-be-running-n328046&quot;&gt;NBC&#x27;s &quot;Meet the Press.&quot;&lt;/a&gt; He added that &lt;a href=&quot;http://climate.nasa.gov/scientific-consensus/&quot;&gt;over 90 percent&lt;/a&gt; of scientists who study the climate agree that climate change is caused by human activity. &quot;That man betokens such a level of ignorance and a direct falsification of existing scientific data. It&#x27;s shocking, and I think that man has rendered himself absolutely unfit to be running for office,&quot; Brown said.&lt;/p&gt; &lt;p&gt;Brown added that climate change has &lt;a href=&quot;http://www.huffingtonpost.com/2015/03/06/california-drought-february- record_n_6820704.html?utm_hp_ref=california-drought&quot;&gt;caused droughts in his state&lt;/a&gt;, as well as severe cold and storms on the east coast.&lt;/p&gt; &lt;p&gt;While Cruz may have seen snow and ice everywhere in New Hampshire, data shows that the country is actually experiencing a &lt;a href=&quot;http://www.huffingtonpost.com/2015/02/19/cold-weather- winter_n_6713104.html&quot;&gt;warmer than average&lt;/a&gt; winter.&lt;/p&gt; &lt;p&gt;Brown’s criticism of Cruz comes one day before the Texas senator is set to announce a &lt;a href=&quot;http://www.huffingtonpost.com/2015/03/22 /ted-cruz-2016_n_6917824.html&quot;&gt;presidential campaign&lt;/a&gt;. &lt;/p&gt; &lt;/div&gt; &lt;div class=&quot;original&quot;&gt; &lt;a href=&quot;http://www.huffingtonpost.com/2015/03/22/ted-cruz-climate-change_n_6919002.html&quot;&gt;VIEW ORIGINAL&lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;script src=&quot;//code.jquery.com/jquery-latest.js&quot;&gt;&lt;/script&gt; &lt;script src=&quot;/static/js/modal.js&quot;&gt;&lt;/script&gt; &lt;script src=&quot;/static/js/bootbox.min.js&quot;&gt;&lt;/script&gt; &lt;script src=&quot;/static/js/site.js&quot;&gt;&lt;/script&gt; &lt;script&gt; (function(i,s,o,g,r,a,m){i[&#x27;GoogleAnalyticsObject&#x27;]=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,&#x27;script&#x27;,&#x27;//www.google-analytics.com/analytics.js&#x27;,&#x27;ga&#x27;); ga(&#x27;create&#x27;, &#x27;UA-56257533-1&#x27;, &#x27;auto&#x27;); ga(&#x27;send&#x27;, &#x27;pageview&#x27;); &lt;/script&gt; &lt;/body&gt; &lt;/html&gt;";


        wv.loadData(stripHtml(s), "text/html", "UTF-8");

    }

    public String stripHtml(String html) {
        return Html.fromHtml(html).toString();
    }

}

여기에 이미지 설명 입력


10

이 코드를 시도하십시오.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N){
   yourtextview.setText(Html.fromHtml(yourstring,Html.FROM_HTML_MODE_LEGACY));
}
else {
   yourtextview.setText(Html.fromHtml(yourstring));
}

7

이 시도:

wv = (WebView) findViewById(R.id.wv);
String s = "You HTML string";
wv.loadData(stripHtml(s), "text/html", "UTF-8");

public String stripHtml(String html) {
    return Html.fromHtml(html).toString();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.