在安卓中使用 JavaScript 设置内容时出现编码问题

Encoding issue when setting a content using javascript in android

本文关键字:问题 编码 设置 JavaScript      更新时间:2023-09-26

在webview中,我将使用css加载静态html文件。

webView.loadUrl("file:///android_asset/customhtml.html

在该 html 中,我还将元标记中的编码设置为 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

加载此文件后,我将内容设置为

webView.loadUrl("javascript:setContent(" + JSONObject.quote(content)+")");

这是JavaScript

`function setContent(contentToSet)
{ 
    setBaseURL();
    var mailContentElement = document.getElementById('mailcontentid'); 
    mailContentElement.innerHTML = ""
    handleContentinHTML($('mailcontentid'),contentToSet);
    androidResponse(true);   //method to call android js interface
}
function handleContentinHTML (contentEl, value)
{
    contentEl.innerHTML = value;
}`

问题:设置内容时,例如filename=0000%3Cimg%20src%3da%20onerror%3dalert(test)%3Eb4911111会将其转换为html图像标记并显示警报消息。此内容的显示方式与文本形式不完全相同。

我尝试过的一些测试:

1 - 在 Web 视图设置settings.setDefaultTextEncodingName("utf-8");中设置e编码

2 - 将 HTML 文件转换为字符串并加载为myWebView.loadDataWithBaseURL(null, convertfiletohtmlString, "text/html", "utf-8", null);并使用 JavaScript 设置内容。

3 - 在 JavaScript 中使用 escape(contentToSet) ;

似乎什么都不起作用。请帮我发布您的建议。

起初我没有在较低版本中检查这一点。当我检查时,它在 kitkat

感谢您的支持。

创建一个 HTML 转义函数:

function htmlEscape(str) {
    return String(str)
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}

(取自这个问题的最佳答案)。

然后更改函数以调用以下命令:

function handleContentinHTML (contentEl, value)
{
    contentEl.innerHTML = htmlEscape(value);
}

虽然如果你使用的是JQuery,你可以使用text()来设置它:

function handleContentinHTML (contentEl, value)
{
    contentEl.text(value);
}