欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?

程序员文章站 2022-05-21 18:33:30
...
不好意思,我也不知道这个问题去哪个栏目问,该在那个编程语言板块,我就都问问吧,总有懂的人!

就是比如我复制一个网页的内容,其中有文本,也有图片,

要是把他粘贴到一个*.txt里,他就粘贴出来是一个纯字符串;

要是把他粘贴到一个word文档里,他就是包含html 标签和 css 样式的一段排好版的文字;

要是把他粘贴到 QQ聊天窗口,就是 图片 + 字符串,

我就不明白我剪切板里到底是个什么东西?

这个东西是用什么编码的?

其实为问这个的目的,就是想重新编码剪切板..

javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?
javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?
javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?


回复内容:

不好意思,我也不知道这个问题去哪个栏目问,该在那个编程语言板块,我就都问问吧,总有懂的人!

就是比如我复制一个网页的内容,其中有文本,也有图片,

要是把他粘贴到一个*.txt里,他就粘贴出来是一个纯字符串;

要是把他粘贴到一个word文档里,他就是包含html 标签和 css 样式的一段排好版的文字;

要是把他粘贴到 QQ聊天窗口,就是 图片 + 字符串,

我就不明白我剪切板里到底是个什么东西?

这个东西是用什么编码的?

其实为问这个的目的,就是想重新编码剪切板..

javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?
javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?
javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?


javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?

网页的HTML吧,Notepad++有粘贴为html的选项


你可以理解你复制的东西是一个Object,具体粘贴成什么样子,就看目标软件从你的Object当中获取了哪些内容


本质上应该是二进制吧
在windows上,可以通过调用不同的的方法,直接取出音频,图像或文本对象
网页的话,取出的应该都是string

如果用的是.net,可以用 System.Windows.Clipboard 这个类
复制的是网页时,Clipboard.GetText(TextDataFormat.Html)应该就能取出html字符串
具体参考MSDN: https://msdn.microsoft.com/zh-cn/library...


感觉剪切板里面是你网页html,文本,图片的等内容,因为你在选中页面某部分时,用F12打开调试,可以看到在html代码中,相应代码部分也是被选中的,而记事本只显示纯文本,因为它读取不了图片链接和html标签等,world文档能读取图片路径,qq也一样


针对网页来说,复制的应该是 选中部分的html源码,至于输出的时候会输出成什么样子是由你使用的软件的解释的。类似的,如果你复制了一个文件,然后粘贴到word里面是一个引用,粘贴到文本框则是文件名;而如果你复制了多行文本粘贴到单行文本框可能只保留第一行,也可能所有的换行符被丢掉了合并为一行。


剪切板弄走和粘贴的是某个程序运行过程中的内存变量
之所以不同是你目标程序对其读取能力不同


好巧,昨天正好我也想弄个东西,把剪切板里的内容都反转再输出,但是遇到的就是各种编码问题,还有图片的转换。mark下来看看。


我之前写过一个《你的笔记本里有几个剪切板?》。但具体这剪切板怎么工作,我也不知道。搜了一下 Stack Overflow,这个链接可能有帮助:Clipboard Operations (Windows)。在 Paste Operations 下面说了,系统剪切板可以导出不同的格式,一个窗口可以设置自己的粘贴格式,比如记事本可以就只能获取文本内容,而 Word 还可以获取其中的图片,乃至文本格式,等等。

外,不得不提的是,不同操作系统的剪切板是不一样的。比如:Linux 下面复制一个文件,其实是复制了文件路径……和 Windows 上面的情况大大不同。

关于剪切板,这里可能给出了所有答案:hluk/CopyQ: Clipboard manager with advanced features。安装试了一下,效果不错,从 Word 里和网页上拷贝的东西都能挺好的显示出来:

javascript - 当你复制一个网页的时候,你的剪切板里是什么呢?

其他一些参考链接:

  • 从浏览器复制一段文字,粘贴到 Evernote 客户端(Windows),Evernote 为什么能得到原网页的网址呢?不会有安全问题么? - 葛致良的回答 - 知乎


储存的是一个数据结构
参见:windows api 设置剪切板内容


以下针对Win32进行讨论。@aristotll 的答案中提到了Notepad++的选择性粘贴,于是我按图索骥,找到了对应的源码,摘录如下:

case IDM_EDIT_PASTE_AS_RTF:
case IDM_EDIT_PASTE_AS_HTML:
{
    LongRunningOperation op;
    UINT f = RegisterClipboardFormat(id==IDM_EDIT_PASTE_AS_HTML?CF_HTML:CF_RTF);

    if (!IsClipboardFormatAvailable(f))
        return;

    if (!OpenClipboard(NULL))
        return;

    HGLOBAL hglb = GetClipboardData(f);
    if (hglb != NULL)
    {
        LPSTR lptstr = (LPSTR)GlobalLock(hglb);
        if (lptstr != NULL)
        {
            // Call the application-defined ReplaceSelection
            // function to insert the text and repaint the
            // window.
            _pEditView->execute(SCI_REPLACESEL, 0, (LPARAM)lptstr);

            GlobalUnlock(hglb);
        }
    }
    CloseClipboard();
}
break;

由此可以看出,剪贴板格式并非有限种,而是可以用RegisterClipboardFormat()自行定义的。更多细节可参考MSDN上的相关资料。


剪切板是电脑磁盘中的一块区域(以前学电脑基础时遇到过),存的应该是二进制,粘贴就看软件的支持了,比如网页里访问剪切板有限制,qq,office这些是本地软件,权限更高所以内容全透明访问