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 文字列を形成しているかどうかを確認します。

有効な UTF-8 バイト形式は、 Wikipediaで見つけることができます。

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を無視するだけで、特別な処理はありません。
(実際には、UTF-8 を UTF-16 (または Ansi など) に変換する API があります)。

于 2008-10-03T05:31:36.303 に答える
0

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

-アダム

于 2008-10-03T03:20:51.530 に答える