C++ 在CHtmlEditCtrl::SetDocumentHTML中使用Unicode
如何正确显示Unicode(UTF-16或UTF-8输入) 这个程序是用Unicode编译的 例如,给定以下带有C++ 在CHtmlEditCtrl::SetDocumentHTML中使用Unicode,c++,mfc,C++,Mfc,如何正确显示Unicode(UTF-16或UTF-8输入) 这个程序是用Unicode编译的 例如,给定以下带有charset=utf-8meta标记的输入: CString u16 = LR"(<!DOCTYPE><html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head> <body>ελλ
charset=utf-8
meta标记的输入:
CString u16 = LR"(<!DOCTYPE><html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head>
<body>ελληνικά 华语 CHtmlEditCtrl::SetDocumentHTML
uses a class called CStreamOnCString
.
CStreamOnCString
at some point calls
m_strAnsi = m_strStream;
CString u16=LR”(
ελληνικά 华语 CHtmlEditCtrl::SetDocumentHTML
使用名为CStreamOnCString
的类
CStreamOnCString
在某些点调用
class CMyHtmlEditCtrl : public CHtmlEditCtrl
{
public:
template <class Type>
HRESULT SetDocumentHTML_unicode(CStringT<Type, StrTraitMFC<Type>> html)
{
HRESULT hr = E_NOINTERFACE;
CComPtr<IHTMLDocument2> document;
if(!GetDHtmlDocument(&document))
return hr;
IStream *istream = SHCreateMemStream(
reinterpret_cast<const BYTE*>(html.GetBuffer()), sizeof(Type)*html.GetLength());
if(istream)
{
CComQIPtr<IPersistStreamInit> psi = document;
if(psi)
hr = psi->Load(istream);
istream->Release();
}
html.ReleaseBuffer();
return hr;
}
};
其中m_strAnsi
是一个存储缓冲区,m_stream
是CStringW
源。我认为这是一个错误,因为它没有将源复制到缓冲区。相反,它使用CW2A(m_stream,CP\u ACP)
在发送数据之前,可以通过另一个CP\u ACP
转换来纠正此错误
或者,我们可以编写自己的函数,如下所示:
类CMyHtmlEditCtrl:public CHtmlEditCtrl
{
公众:
模板
HRESULT SetDocumentHTML_unicode(CStringT html)
{
HRESULT hr=电子接口;
采购文件;
如果(!GetDHtmlDocument(&document))
返回人力资源;
IStream*IStream=SHCreateMemStream(
reinterpret_cast(html.GetBuffer())、sizeof(Type)*html.GetLength();
如果(istream)
{
CCOMKIPTR psi=文件;
如果(磅/平方英寸)
hr=psi->负载(i流);
istream->Release();
}
html.ReleaseBuffer();
返回人力资源;
}
};
现在我们可以调用SetDocumentHTML\uUnicode(utf8\uString)
或SetDocumentHTML\uUnicode(utf16\uString)
在将utf8
变量转换为UTF-16之前,您是否验证了该变量是否确实保存了正确编码的UTF-8数据?@RemyLebeau是的,该变量是正确的。我添加了最低限度的示例。在m\u htmledit\u ctrl.SetDocumentHTML(CString(CA2W(utf8,CP\u utf8))行中
您不是在尝试将utf-8转换为utf-8吗?我的理解是CP_UTF8是UTF8代码页的类型定义。由于utf16有代码页1200,当您尝试m_htmledit_ctrl.SetDocumentHTML(CString(CA2W(UTF8,1200))时会发生什么
@AllanCameronCA2W
将char
数据转换为wchar\u t
,代码页是char
的源代码页data@BarmakShemirani你绝对不需要做CA2W(CW2A(utf16,CP\u UTF8),CP\u ACP)
。事实上SetDocumentHTML(utf16)
无法正常工作是一个令人不安的问题。即使您正在为Unicode构建应用程序,SetDocumentHTML()
的行为就像它需要ANSI数据一样,但它不应该这样。因此,请关注UTF-16不起作用的原因,将UTF-8从等式中完全去掉,让它像一个魔咒一样工作!