估计是.Net的一个Bug, 用剪切板取到的HTML汉字变乱码

LeadWorld 2007-04-27 05:34:09
我写了一个WinForm程序希望从剪切板中获取Html代码。
从IE中圈一段网页,按Ctr+C,在C#中通过剪切板获取HTML代码。(用拖拽也一样效果)
string st = "HTML Format";
object o = Clipboard.GetData(st);

得到的字符串中,英文完好,但是汉字变成了乱码。
下面的原始HTML代码:

请到<a href="http://post.baidu.com/f?ct=&tn=&rn=&pn=&lm=&kw=%B0%D9%B6%C8&rs2=0&myselectvalue=1&word=%B0%D9%B6%C8&tb=on" target="_blank">百度吧</a>留言

C#变成了:

璇峰埌<A
href="http://post.baidu.com/f?ct=&tn=&rn=&pn=&lm=&kw=%B0%D9%B6%C8&rs2=0&myselectvalue=1&word=%B0%D9%B6%C8&tb=on"
target=_blank>鐧惧害鍚?/A>鐣欒█



经研究发现,原本IE中的HTML是GB2312的编码,被.NET当成了UTF8编码转换。转化后的英文没有问题,汉字成了乱码。


我尝试用下面的代码把汉字乱码恢复正常。
string a;
byte[] bs;
bs = System.Text.Encoding.Default.GetBytes(o.ToString());
a = System.Text.Encoding.UTF8.GetString(bs);
但是有些极端情况下,还是存在少量的乱码无法恢复,因为原始的信息已经被破坏了。
向上面那段HTML就变成了:
请到<A
href="http://post.baidu.com/f?ct=&tn=&rn=&pn=&lm=&kw=%B0%D9%B6%C8&rs2=0&myselectvalue=1&word=%B0%D9%B6%C8&tb=on"
target=_blank>百度?/A>留言



不知道哪位达人有办法解决这个问题??
...全文
477 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeadWorld 2007-05-10
  • 打赏
  • 举报
回复
up
LeadWorld 2007-04-28
  • 打赏
  • 举报
回复
十分谢谢hertcloud(·£孙子兵法£·),问题解决了。
我是在拖拽的DragEnter事件中捕获Html。
通过e.Data.GetFormats()返回的是“HTML Format”。
e.Data.GetData()只接受“Html Format”,如果是“HTML Format”就会返回null。

hertcloud 2007-04-28
  • 打赏
  • 举报
回复
if (Clipboard.ContainsText(TextDataFormat.Html))
{
System.IO.MemoryStream vMemoryStream =
Clipboard.GetData("Html Format") as System.IO.MemoryStream;
vMemoryStream.Position = 0;
byte[] vBytes = new byte[vMemoryStream.Length];
vMemoryStream.Read(vBytes, 0, (int)vMemoryStream.Length);
textBox1.Text = Encoding.UTF8.GetString(vBytes);
}
经过测试
Vs2005+ sp1 windows2003+ sp2
下完全 没有任何问题
CathySun118 2007-04-28
  • 打赏
  • 举报
回复
web.config里设置编码
LeadWorld 2007-04-28
  • 打赏
  • 举报
回复
楼上的
MemoryStream vMemoryStream = Clipboard.GetData("Html Format") as MemoryStream;
这一句只能获得null
hertcloud 2007-04-27
  • 打赏
  • 举报
回复
能过如下代码在剪贴板中获取含HTML格式的文本时发现当内容出现汉字的时候会有乱码
if (Clipboard.ContainsText(TextDataFormat.Html))
textBox1.Text = Clipboard.GetText(TextDataFormat.Html);
通过剪贴板工具分析,HTML格式的文本是UTF8编码方式
看来Clipboard.GetText()是解码出了问题
那就自己来完成这个解码工作吧!
if (Clipboard.ContainsText(TextDataFormat.Html))
{
MemoryStream vMemoryStream =
Clipboard.GetData("Html Format") as MemoryStream;
vMemoryStream.Position = 0;
byte[] vBytes = new byte[vMemoryStream.Length];
vMemoryStream.Read(vBytes, 0, (int)vMemoryStream.Length);
textBox1.Text = Encoding.UTF8.GetString(vBytes);
}
noway8881 2007-04-27
  • 打赏
  • 举报
回复
&很像是被xml解掉的。
LeadWorld 2007-04-27
  • 打赏
  • 举报
回复
是WinForm程序!!!
什么web.config!!!
怎么这么多回帖不看帖的!!!!
zuimengzhe 2007-04-27
  • 打赏
  • 举报
回复
web.config里设置编码
LeadWorld 2007-04-27
  • 打赏
  • 举报
回复
怎么这么多回帖不看帖的???
zhqs1000 2007-04-27
  • 打赏
  • 举报
回复
bs中在web。config里设置编码,就可以。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧