public string HtmlFData(string html) { StringBuilder sb = new StringBuilder(); Encoding encoding = Encoding.UTF8; //Encoding.GetEncoding(936); string Header = @" Version: 1.0 StartHTML: {0:000000} EndHTML: {1:000000} StartFragment: {2:000000} EndFragment: {3:000000} "; string HtmlPrefix = @" <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""> <!--StartFragment--> "; string HtmlSuffix = @" <!--EndFragment--> "; // Get lengths of chunks int HeaderLength = encoding.GetByteCount(Header);//注意這裏這樣做,不直接取字符長度,是中文utf8佔3字節,不是unicode的英文下的1字節 HeaderLength -= 16; // extra formatting characters {0:000000} int PrefixLength = encoding.GetByteCount(HtmlPrefix); int HtmlLength = encoding.GetByteCount(html); int SuffixLength = encoding.GetByteCount(HtmlSuffix); // Determine locations of chunks int StartHtml = HeaderLength; int StartFragment = StartHtml + PrefixLength; int EndFragment = StartFragment + HtmlLength; int EndHtml = EndFragment + SuffixLength; // Build the data sb.AppendFormat(Header, StartHtml, EndHtml, StartFragment, EndFragment); sb.Append(HtmlPrefix); sb.Append(html); sb.Append(HtmlSuffix); return sb.ToString(); }
var data = HtmlFData(strHtml); MemoryStream sMem = new MemoryStream(); byte[] byteHtml = Encoding.UTF8.GetBytes(data); sMem.Write(byteHtml, 0, byteHtml.Length); sMem.Flush(); var dataObject = new DataObject(); dataObject.SetData(DataFormats.Html, sMem); Clipboard.SetDataObject(dataObject); ... sMem.Close();
注意如果你直接用SetText這個api,並設置了Html格式,中文是會亂碼的,所以這裏用內存流把字符轉爲了utf-8的字節嘛保存的流對象裏。