複製(剪切板)到底是複製了什麼?

選中 複製的東西是什麼格式的?

題主從github上複製了 一小段代碼

複製到sublime.終端,vim 等編輯器都是 純文本顯示

for _, siteConfig := range siteConfigs {
switch siteConfig.Type {
case "$in":
for _, id := range siteConfig.SiteIds {
inSiteMap[id] = siteConfig.Group
}
case "$range":
if len(siteConfig.SiteIds) != 2 {
log.Warn("input siteId"s size is not equal to 2 in type $range")
continue
}
for id := siteConfig.SiteIds[0]; id &< siteConfig.SiteIds[1]; id++ { rangeSiteMap[id] = siteConfig.Group } case "$default": defaultGroup = siteConfig.Group default: log.Warnf("input type: %s not in($range, $in, $default)", siteConfig.Type) } } //$in &> $range, default必須存在
if defaultGroup == "" {
panic("site config must have a default group")
}

但是 複製 到 evernote 中 卻可以顯示 顏色 (註明: 而且是一模一樣的顏色, github顏色換了, 對應複製過來到evernote 也會換)

那麼問題來了, 我們從html中 選中複製的時候,到底是複製了 什麼格式的文本呢? 顏色等樣式是如何存儲的?


windows也好,mac也罷,剪貼板的功能提供都是一個類。這個類允許輸入的類型包括且不限於:純文本、二進位流(圖片)、html/富文本格式、文件索引。

同時它也提供了若干API,如果粘貼的時候接收粘貼的程序中可以根據需求申請不同的內容。複製自一個網頁,輸入格式是html/富文本,粘貼的時候如果只接受純文本,則會將渲染好的文本貼過來;如果接受富文本,則會將格式一併輸出。如果複製自一個文件,粘貼的時候接受文件則會傳送文件索引;只接受純文本則是傳遞路徑;接受富文本則有可能帶著圖標一併送過去一個帶格式和鏈接的排版文本。大體上就是這樣。

至於更詳細的細節,請參看Win32API/OS X API。


瀉藥

好久不寫桌面程序了

記得剪貼板就是提供了一個內存空間

放啥都行

只不過放的時候標註是啥

也可以說是設置內容類型

並且按指定類型格式寫入

拿Windows API 來說

OpenClipboard 、GlobalAlloc

打開、分配剪貼板內存後

HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);

里有uFormat標示數據類型

比如:

CF_TEXT 以NULL結尾的ANSI字符集字元串

CF_OEMTEXT 含有文字數據(與CF_TEXT類似)的內存塊

CF_UNICODETEXT 含有Unicode文字的內存快

CF_SYLK 包含Microsoft 符號連結數據格式的整體內存塊

CF_DIF 包含數據交換格式(DIF)之數據的整體內存塊

CF_BITMAP 與設備相關的點陣圖格式

CF_DIB 設備無關點陣圖的內存塊

CF_PALETTE 調色盤句柄

CF_METAFILEPICT 以舊的metafile格式存放的圖片

CF_ENHMETAFILE 增強型metafile句柄

CF_PENDATA 與Windows的筆式輸入擴充功能聯合使用

CF_WAVE 聲音文件

CF_RIFF 使用資源交換文件格式數據

CF_HDROP 與拖放服務相關的文件列表

所以應用程序拿的時候

也是按照格式拿的

並且

拿到指定內容後

根據自己的特性

可能還會對數據做過濾等後續操作


就是一大堆判斷啊...

某 head 版的 vim 從 pb 拿圖像過來的話會有歡樂的大亂碼哦

我一直覺得用 LibCaca 可以改成 ASCII ART 顯示之類的

(以上是閒話)

反正你要在任何地方顯示一個東西

電腦裡一定得圈一塊記憶體放著這些資料嘛

你全選了 還按了複製

那就是給了個指針跟大小指向那塊記憶體中的某個地方咯

最早的玩法就是把那塊記憶體吐到我們要貼上的這個區塊

讀取什麼的就看對方造化

後來當然因爲各種 OO 理念什麼的

會在指向讀取複製的時候有各種處理

那就是各種判斷啊

ihu 兩頭都是文本:

直接噴

else ihu 指向的記憶體一部分是文本一部分是圖像 貼上的APP只認識圖像:

轉圖像( 文本的部分, 長度)+ 圖像的部分 #照說這個取值是不用加的

etc....

(作爲一個臺灣人編程有點湖建口音也是很合理的)

這種事情知道就好

實作會翻臉的....


剪貼板本身有數據格式,他們之間又存在一些轉換關係。

以你的case來說,你複製的是html,相應的內容可以轉換為rtf,純文本。具體如何引用clipboard里的數據,這是有目標程序來決定的。


剪貼板可以同時包含多種格式。寫成程序的話,邏輯大概就是這樣:

IDataObject data = Clipboard.GetDataObject( );

if (data.GetDataPresent(DataFormats.Text)) {

// 純文本

} else if (data.GetDataPresent(DataFormats.Html)) {

// Html內容

}

應用程序可以選擇自己能夠處理的格式。文本編輯器一般來說都只接受純文本,像你說的Sublime和VIM。Evernote的定位決定了它則能處理更豐富的格式。


顯示顏色只是編譯器/文本處理器的設置吧,跟剪貼板的數據無關


推薦閱讀:

如何觀測SSD盤內部狀態?
如何通過8個月進入研發行業?
沒有IT背景的人,怎麼系統的學習web後端開發?
學習PHP不如JAVA嗎?

TAG:HTML | 軟體開發 | 後端技術 | 編程 | 信息技術IT |