我想知道是否有一种简单的方法可以检测剪贴板上的文字是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);
}
}
}
答案 0 :(得分:4)
在this Microsoft page查看CF_LOCALE的定义。它会告诉您剪贴板中文本的区域设置。更好的是,如果您使用CF_UNICODETEXT,Windows将为您转换为UTF-16。
答案 1 :(得分: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。
答案 2 :(得分: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等)。
答案 3 :(得分:0)
您可以查看obj.IsDataAvailable(CF_UNICODETEXT)以查看剪贴板上的内容的unicode版本是否可用。
- 亚当