WindowsクリップボードのテキストがISO 8859またはC ++のUTF-8であるかどうかを確認する方法

StackOverflow https://stackoverflow.com/questions/165551

  •  03-07-2019
  •  | 
  •  

質問

クリップボードのテキストが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);
        }
    }
}
役に立ちましたか?

解決

このMicrosoftページでCF_LOCALEの定義を確認してください。 。クリップボード内のテキストのロケールを示します。さらに良いことに、代わりにCF_UNICODETEXTを使用すると、WindowsはUTF-16に変換します。

他のヒント

UTF-8には、非ASCIIバイトの構造が定義されています。バイトをスキャンして> = 128を検出できます。検出された場合は、有効なUTF-8文字列を形成しているかどうかを確認してください。

有効な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をスキャンできます。

間違えることはありますが、できないと思います:BomなしでUTF-8ファイルをエディターで開くと、デフォルトでISO-8859-1(私のロケール)として表示され、外国語(私にとって)のアクセント付き文字、UTF-8であるという強い視覚的なヒントはありません(他の方法でエンコードされていない限り、たとえばHTMLまたはXMLのcharset宣言):それは完全に有効なAnsiテキストです。

Johnは、「すべてのASCIIテキストは有効なUTF-8」と書きました。ただし、その逆です。

Windows XP +は当然UTF-16を使用し、クリップボード形式を備えていますが、知っている限り、UTF-8は無視され、特別な処理は行われていません。
(まあ、実際にはUTF-8をUTF-16(またはAnsiなど)に変換するAPIがあります)。

obj.IsDataAvailable(CF_UNICODETEXT)を確認して、クリップボードにあるもののUnicodeバージョンが利用可能かどうかを確認できます。

-アダム

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top