QString.replace 不工作
QString.replace not working
我正在尝试处理 HTML QString 中保存的数据。数据编码了 HTML 个标签,例如“<”等。我想将它们转换为适当的符号。
我一直在尝试多种方法,但 none 似乎有效,这表明我遗漏了一些非常简单的东西。
这是代码(已修改以修复之前评论报告的拼写错误):
QString theData = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Arial'; font-size:20pt; font-weight:400; font-style:normal;">
<table border="0" style="-qt-table-type: root; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;">
<tr>
<td style="border: none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; color:#4cb8ff;">This is text on the second page. This page contains a embedded image,</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; color:#4cb8ff;">and audio.</span></p></td></tr></table></body></html>";
QString t2 = theData.replace("&", "&").replace("<", "<").replace(">", ">").replace(""", "'");
然而,t2 的值与替换后的数据相同。
您的代码中没有 t1 的定义,我想您指的是 theData(并且没有双点)。 QString::replace 函数改变字符串的值和 return 对它的引用。
QString s = "abc";
s.replace("a", "z").replace("b", "z");
// s = "zzc";
// if you don't want to alter s
QString s = "abc";
QString t = s;
t.replace("a", "z").replace("b", "z");
但是 escape/unescape html 字符串有更好的方法:
// html -> plain text
QTextDocument doc;
doc.setHtml(theData);
QString t2 = doc.toPlainText();
// plain text -> html
QString plainText = "#include <QtCore>"
QString htmlText = plainText.toHtmlEscaped();
// htmlText == "#include <QtCore>"
如果您只想转换 html 个实体,我使用以下函数,作为对 QString::toHtmlEscaped()
的补充:
QString fromHtmlEscaped(QString html) {
html.replace(""", "\"", Qt::CaseInsensitive);
html.replace(">", ">", Qt::CaseInsensitive);
html.replace("<", "<", Qt::CaseInsensitive);
html.replace("&", "&", Qt::CaseInsensitive);
return html;
}
在所有情况下,都应该str == fromHtmlEscaped(str.toHtmlEscaped())
。
我正在尝试处理 HTML QString 中保存的数据。数据编码了 HTML 个标签,例如“<”等。我想将它们转换为适当的符号。
我一直在尝试多种方法,但 none 似乎有效,这表明我遗漏了一些非常简单的东西。
这是代码(已修改以修复之前评论报告的拼写错误):
QString theData = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Arial'; font-size:20pt; font-weight:400; font-style:normal;">
<table border="0" style="-qt-table-type: root; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;">
<tr>
<td style="border: none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; color:#4cb8ff;">This is text on the second page. This page contains a embedded image,</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; color:#4cb8ff;">and audio.</span></p></td></tr></table></body></html>";
QString t2 = theData.replace("&", "&").replace("<", "<").replace(">", ">").replace(""", "'");
然而,t2 的值与替换后的数据相同。
您的代码中没有 t1 的定义,我想您指的是 theData(并且没有双点)。 QString::replace 函数改变字符串的值和 return 对它的引用。
QString s = "abc";
s.replace("a", "z").replace("b", "z");
// s = "zzc";
// if you don't want to alter s
QString s = "abc";
QString t = s;
t.replace("a", "z").replace("b", "z");
但是 escape/unescape html 字符串有更好的方法:
// html -> plain text
QTextDocument doc;
doc.setHtml(theData);
QString t2 = doc.toPlainText();
// plain text -> html
QString plainText = "#include <QtCore>"
QString htmlText = plainText.toHtmlEscaped();
// htmlText == "#include <QtCore>"
如果您只想转换 html 个实体,我使用以下函数,作为对 QString::toHtmlEscaped()
的补充:
QString fromHtmlEscaped(QString html) {
html.replace(""", "\"", Qt::CaseInsensitive);
html.replace(">", ">", Qt::CaseInsensitive);
html.replace("<", "<", Qt::CaseInsensitive);
html.replace("&", "&", Qt::CaseInsensitive);
return html;
}
在所有情况下,都应该str == fromHtmlEscaped(str.toHtmlEscaped())
。