【问题标题】:How to tell if text on the windows clipboard is ISO 8859 or UTF-8 in C++?如何判断 Windows 剪贴板上的文本是 C++ 中的 ISO 8859 还是 UTF-8?
【发布时间】:2010-09-14 23:58:38
【问题描述】:

我想知道是否有一种简单的方法可以检测剪贴板上的文本是 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);
        }
    }
}

【问题讨论】:

  • ISO 8859-什么?有 8859-1、8859-2 等。
  • 问题的一部分是它似乎也是未知的。你需要 CF_LOCALE 来告诉你。一旦你有了它,整个问题就几乎得到了回答。

标签: c++ windows utf-8 clipboard


【解决方案1】:

this Microsoft page 中查看 CF_LOCALE 的定义。它告诉您剪贴板中文本的语言环境。更好的是,如果您改用 CF_UNICODETEXT,Windows 会为您转换为 UTF-16。

【讨论】:

    【解决方案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。

    【讨论】:

    • 我想我并不是真的指 7 位 ascii,CF_TEXT 返回 0 到 255 的字符,所以它更像 ISO/IEC 8859。我有一个问题,因为法语口音通常具有值130 到 162 之间只占用 8859 中的 1 个字节,但它们需要 2 个字节以 UTF-8 编码。
    • ASCII 根据定义是 7 位的。我会编辑你的问题,让它更清楚一点。
    • 如果找到C0 A0这两个字符。你有什么?它是 UTF-8 中的有效“代码点”,但它也是 ISO 8859 中的两个有效字符。这不是一种可靠的方法。
    • @Martin:对此没有可靠的方法,猜测是最好的办法。
    • @John:如果你只有文字,猜测是最好的方法。您可以询问剪贴板对象的想法。
    【解决方案3】:

    我可能会弄错,但我认为你不会:如果我在编辑器中打开一个没有 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 等)。

    【讨论】:

      【解决方案4】:

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

      -亚当

      【讨论】:

      • 我实际上有代码可以检测到这一点,但我遇到了奇怪的问题,有时我会得到乱码的结果。我想我知道现在的问题是什么。我假设该字符串指向一个 UTF-8 字符串,但它认为它可以指向多种格式,我需要在其上调用 WideCharToMultiByte。
      • 是的,unicode 的一个常见问题是它有很多表示形式,其中只有一种是 UTF8。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2012-12-22
      • 2012-09-04
      • 2013-08-10
      • 2014-11-24
      • 2010-11-18
      • 2011-10-05
      相关资源
      最近更新 更多