Webview中的字符串编码问题

12

我从Web服务获取的响应如下所示

<html><head>
<style type="text/css">
    body{
         color: #FFFFFF; 
         background-color: #000000;
    }
 </style>
</head>
<body><center><div>
Ricardo Viana Vargas  
09-14 Ricardo Viana Vargas é especialista em  gerenciamento de projetos, portfólio e riscos. Foi, nos últimos 15 anos, responsável por mais de 80 projetos de grande porte em diversos países, nas áreas de petróleo, energia, infraestrutura, telecomunicações, informática e finanças, com um portfólio de investimentos gerenciado superior a 18 bilhões de dólares. Foi o primeiro voluntário latino-americano a ser eleito para exercer a função de presidente do conselho diretor (Chairman) do Project Management Institute (PMI), maior organização do mundo voltada para a administração de projetos, com cerca de 500 mil membros e profissionais certificados em 175 países.  Ricardo Vargas escreveu dez livros sobre gerenciamento de projetos, publicados em português e inglês, com mais de 240 mil exemplares vendidos mundialmente. Recebeu em 2005 o prêmio PMI Distinguished Award pela sua contribuição para o desenvolvimento do gerenciamento de projetos e o PMI Professional Development Product of the Year pelo workshop PMDome®, considerado a melhor solução do mundo para o ensino do gerenciamento de projetos. É professor de gerenciamento de projetos em diversos cursos de MBA, participando do conselho editorial de revistas especializadas no Brasil e nos Estados Unidos. Vargas é revisor reconhecido da mais importante referência no mundo sobre gerenciamento de projetos, o PMBOK Guide. Foi também chair da tradução oficial do PMBOK para o português. Engenheiro químico e mestre em Engenharia de Produção pela UFMG, Ricardo Vargas tem também o Master Certificate in Project Management pela George Washington University, além de ser certificado pelo PMI como Project Management Professional (PMP) e pela Scrum Alliance como Certified Scrum Master (CSM). Participou do programa de negociações para executivos da Harvard Law School e tem formação executiva de estratégia e inovação pelo Massachusetts Institute of technology (MIT).Durante onze anos, a partir de 1995, desenvolveu em conjunto com dois sócios um dos mais sólidos negócios de tecnologia, gerenciamento de projetos e terceirização do mercado brasileiro, que contava com 4,000 colaboradores e gerava uma receita anual de 50 milhões de dólares em 2006, quando Ricardo Vargas vendeu sua participação para se dedicar integralmente à internacionalização de seus trabalhos em gerenciamento de projetos. É membro da Association for Advancement of Cost Engineering (AACE), da American Management Association (AMA), da International Project Management Association (IPMA), do Institute for Global Ethics e da Professional Risk Management International Association (PRMIA).
</div> </center>
</body>
</html>

以下是webview的输出:

enter image description here

如何在webview中显示确切的字符?

以下是我用于web视图的代码:

System.out.println("strContent is :: " + strContent);
                    WebView wv = (WebView) findViewById(R.id.webview_portugage);
                    wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
                    wv.loadData(strContent, "text/html", "UTF-8");
6个回答

46

1) 使用WebView.loadDataWithBaseURL方法,它的表现与WebView.loadData方法不同(更好)。

2) 尝试将“UTF-8”编码替换为其他编码方式,例如US-ASCII。最好确定您要显示的文本实际使用的编码方式。


我替换了句子wv.loadData(object1.getString("post_content").toString(), "text/html", "US-ASCII"); 但结果仍然相同没有变化。 - dilipkaklotar
这很疯狂,但它能用。为什么loaddatawithbaseurl更好的任何解释? - njzk2
1
loadData将参数存储到字符串URL中,并将此参数传递给loadUrl。loadDataWithBaseURL直接进行加载。研究WebView源代码,你会学到更多的知识 ;) - Pointer Null
13
对我来说,仅仅使用webView.loadDataWithBaseURL(null, htmlSource, "text/html", "UTF-8", null)代替webView.loadData(htmlSource, "text/html", "UTF-8")就可以解决编码问题。谢谢! - Jonik
webView.loadDataWithBaseURL() 在苦苦挣扎了一个小时后神奇地生效了。谢谢 - Ansh
这是一个奇怪的Android问题。 - Roel

11

我在使用 WebView.loadData 时,通过使用 "text/html; charset=utf-8" 作为 MIME 类型解决了我的问题。

编辑:感谢 AndyD 的评论。不幸的是,这个提示并不适用于每一种设备(我认为它取决于所使用的 Webkit 版本)。使用 WebView.html#loadDataWithBaseURL 在每一个(测试过的)设备上都可以工作。


对我也起作用了。不错的提示,谢谢!这是我的调用代码:dwv.loadData(mContentFromFeed, "text/html; charset=utf-8", null); - Sparky
2
对我来说不起作用,然而使用loadDataWithBaseUrl方法解决了我的问题。 - Andy Dennie

6
content.loadData(htmlsource, "text/html; charset=utf-8", null);

它对我有用 :)


4

基于您的原始代码,您可以使用两个选项:

使用loadDataWithBaseURL()

wv.loadDataWithBaseURL(null, strContent, "text/html", "UTF-8", null);

或者使用 loadData()

wv.loadData(strContent, "text/html; charset=utf-8", "UTF-8");

0

这段代码对我有效。

String base64EncodedString = null;
                        try {
                            base64EncodedString = android.util.Base64.encodeToString((preString+mailContent.getBody()+postString).getBytes("UTF-8"), android.util.Base64.DEFAULT);
                        } catch (UnsupportedEncodingException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        if(base64EncodedString != null)
                        {
                            wvMailContent.loadData(base64EncodedString, "text/html; charset=utf-8", "base64");  
                        }
                        else
                        {
                            wvMailContent.loadData(preString+mailContent.getBody()+postString, "text/html; charset=utf-8", "utf-8");
                        }

0
我曾经遇到过同样的问题,使用 MIME 类型为 "text/html; charset=utf-8" 的 WebView.loadData() 对我无效。但唯一的问题是我没有在测试 HTML 中设置 "meta http-equiv="Content-Type" content="text/html; charset=utf-8"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接