C++ 在CHtmlEditCtrl::SetDocumentHTML中使用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>ελλ

如何正确显示Unicode(UTF-16或UTF-8输入)

这个程序是用Unicode编译的

例如,给定以下带有
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))时会发生什么
@AllanCameron
CA2W
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从等式中完全去掉,让它像一个魔咒一样工作!