【问题标题】:Can't copy unicode(used wchar_t) in HTML format to clipboard无法将 HTML 格式的 unicode(使用 wchar_t)复制到剪贴板
【发布时间】:2014-02-09 01:33:23
【问题描述】:

当我使用 char 时,可以以 HTML 格式复制到剪贴板,但如果我使用 wchar_t,它就不起作用了

当我粘贴时它只是空的

这是我的代码请帮助我

或者有没有更好的方式来使用 unicode(不使用 wchar_t)?如果你帮助我

void copyStringEnd(wchar_t *string, wchar_t *buffer)
{
    int i = 0;
    int string_StartIndex = 0;

    while (string[string_StartIndex] != NULL)
    {
        string_StartIndex++;
    }

    while (buffer[i] != NULL)
    {
        string[string_StartIndex + i] = buffer[i];
        i++;
    }
    string[string_StartIndex + i] = '\0';
}

int main()
{
    wchar_t *html = L"abc";
    wchar_t *buf = (wchar_t*)malloc(400 + wcslen(html));

    wcscpy_s(buf, 200,
            L"Version:0.9\r\n"
            L"StartHTML:00000000\r\n"
            L"EndHTML:00000000\r\n"
            L"StartFragment:00000000\r\n"
            L"EndFragment:00000000\r\n"
            L"<html><body>\r\n"
            L"<!--StartFragment -->\r\n");

    copyStringEnd(buf, html);
    copyStringEnd(buf, L"\r\n");

    copyStringEnd(buf,
            L"<!--EndFragment-->\r\n"
            L"</body>\r\n"
            L"</html>");

    wchar_t *ptr = wcsstr(buf, L"StartHTML");
    wsprintfW(ptr + 10, L"%08u", wcsstr(buf, L"<html>") - buf);
    *(ptr + 10 + 8) = '\r';

    ptr = wcsstr(buf, L"EndHTML");
    wsprintfW(ptr + 8, L"%08u", wcslen(buf));
    *(ptr + 8 + 8) = '\r';

    ptr = wcsstr(buf, L"StartFragment");
    wsprintfW(ptr + 14, L"%08u", wcsstr(buf, L"<!--StartFrag") - buf);
    *(ptr + 14 + 8) = '\r';

    ptr = wcsstr(buf, L"EndFragment");
    wsprintfW(ptr + 12, L"%08u", wcsstr(buf, L"<!--EndFrag") - buf);
    *(ptr + 12 + 8) = '\r';



    if (OpenClipboard(NULL)) {
        EmptyClipboard();

        HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, wcslen(buf) * sizeof(wchar_t) + 4);

        wchar_t *ptrs = (wchar_t *)GlobalLock(hText);
        wcscpy_s(ptrs, wcslen(buf) + 2, buf);
        GlobalUnlock(hText);

        SetClipboardData(RegisterClipboardFormatA("HTML Format"), hText);
        CloseClipboard();
        GlobalFree(hText);
    }
    free(buf);
}

【问题讨论】:

标签: c++ c unicode clipboard wchar-t


【解决方案1】:

根据the documentation

剪贴板唯一支持的字符集是 UTF-8 编码的 Unicode。

您所说的“Unicode”是 UTF-16-LE。这不是 UTF-8。如果您尝试将 UTF-16-LE 解释为 UTF-8,它看起来会以 "V\0" 开头,然后大多数代码只会将 \0 视为字符串的结尾并停止读取。

您需要将其编码为 UTF-8(存储为 char,而不是 wchar_t)并粘贴。

【讨论】:

  • 如果我使用 char 是自动 UTF-8 吗?如果不是,我该如何编码?
  • 使用WideCharToMultiByte()将UTF-16编码的wchar_t缓冲区转换为UTF_8编码的char缓冲区,然后可以将char缓冲区放到剪贴板上。
猜你喜欢
  • 1970-01-01
  • 2019-07-07
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多