如何判断Windows剪贴板上的文本是C ++中的ISO 8859还是UTF-8?
时间:2020-03-06 15:03:37 来源:igfitidea点击:
我想知道是否有一种简单的方法来检测剪贴板上的文本是使用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); } } }
解决方案
我们可以检查以查看obj.IsDataAvailable(CF_UNICODETEXT)来查看剪贴板上的Unicode版本是否可用。
-亚当
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的字节。
我可能会误会,但我想我们不能:如果我在编辑器中打开没有Bom的UTF-8文件,则默认情况下将其显示为ISO-8859-1(我的语言环境),并在某些奇怪的外部用法(例如我)带有重音符号的字符,我没有很强的视觉暗示它是UTF-8(除非以其他方式编码,例如HTML或者XML中的字符集声明):这是完全有效的Ansi文本。
约翰写了"所有ASCII文本都是有效的UTF-8",但事实恰恰相反。
Windows XP +自然使用UTF-16,并具有剪贴板格式,但是AFAIK只是忽略UTF-8,没有特殊处理。
(实际上,有一个API可将UTF-8转换为UTF-16(或者Ansi等)。
在此Microsoft页面上查看CF_LOCALE的定义。它告诉我们剪贴板中文本的语言环境。更好的是,如果我们改用CF_UNICODETEXT,则Windows将为我们转换为UTF-16.