6

我想知道是否有一种简单的方法可以检测剪贴板上的文本是 ISO 8859 还是 UTF-8 ?

这是我当前的代码:

    COleDataObject  obj;

    if (obj.AttachClipboard())
    {
        if (obj.IsDataAvailable(CF_TEXT))
        {
            HGLOBAL hmem = obj.GetGlobalData(CF_TEXT);
            CMemFile sf((BYTE*) ::GlobalLock(hmem),(UINT) ::GlobalSize(hmem));
            CString buffer;

            LPSTR str = buffer.GetBufferSetLength((int)::GlobalSize(hmem));
            sf.Read(str,(UINT) ::GlobalSize(hmem));
            ::GlobalUnlock(hmem);

            //this is my string class
            s->SetEncoding(ENCODING_8BIT);
            s->SetString(buffer);
        }
    }
}
4

4 回答 4

4

在这个 Microsoft 页面上查看 CF_LOCALE 的定义。它告诉您剪贴板中文本的语言环境。更好的是,如果您改用 CF_UNICODETEXT,Windows 将为您转换为 UTF-16。

于 2008-10-03T14:05:59.180 回答
2

UTF-8 为非 ASCII 字节定义了结构。您可以扫描 >= 128 的字节,如果检测到任何字节,请检查它们是否形成有效的 UTF-8 字符串。

可以在Wikipedia上找到有效的 UTF-8 字节格式:

Unicode             Byte1           Byte2           Byte3           Byte4
U+000000-U+00007F   0xxxxxxx
U+000080-U+0007FF   110xxxxx        10xxxxxx
U+000800-U+00FFFF   1110xxxx        10xxxxxx        10xxxxxx
U+010000-U+10FFFF   11110xxx        10xxxxxx        10xxxxxx        10xxxxxx

旧答案:

您不必 - 所有 ASCII 文本都是有效的 UTF-8,因此您可以将其解码为 UTF-8,它会按预期工作。

要测试它是否包含非 ASCII 字符,您可以扫描 >= 128 的字节。

于 2008-10-03T03:21:50.747 回答
1

我可能会弄错,但我认为你不能:如果我在编辑器中打开一个没有 Bom 的 UTF-8 文件,它默认显示为 ISO-8859-1(我的语言环境),并且除了一些奇怪的外文用法(对于我)重音字符,我没有强烈的视觉暗示它是 UTF-8(除非它在其他地方以另一种方式编码,例如 HTML 或 XML 中的字符集声明):它是完全有效的 Ansi 文本。

John 写道“所有 ASCII 文本都是有效的 UTF-8”,但反过来也是如此。

Windows XP+ 自然使用 UTF-16,并有一个剪贴板格式,但 AFAIK 它只是忽略 UTF-8,没有对其进行特殊处理。
(嗯,实际上有一个 API 可以将 UTF-8 转换为 UTF-16(或 Ansi 等))。

于 2008-10-03T05:31:36.303 回答
0

您可以查看 obj.IsDataAvailable(CF_UNICODETEXT) 以查看剪贴板上的 unicode 版本是否可用。

-亚当

于 2008-10-03T03:20:51.530 回答