WindowsクリップボードのテキストがISO 8859またはC ++のUTF-8であるかどうかを確認する方法
質問
クリップボードのテキストが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バージョンが利用可能かどうかを確認できます。
-アダム