蛙蛙请教:把一段c算法代码转换成c#代码。

onlytiancai 2007-04-10 09:59:22
蛙蛙请教:把一段c算法代码转换成c#代码。
这是一段剪贴板的数据转换算法代码,请帮忙把UTF8ToHtml转换成c#代码,我转了一下,根本不能用。
再帮忙写下注释,简单说一下原理,谢谢。
原文如下:
I was working on a project where I had to paste into textbox HTML, copied from the Browser. A quick search on "HTML Clipboard Format" in MSDN gives you an article that thoroughly explained how HTML is kept in the Clipboard. Unfortunately, this article tells you that it's kept in UTF-8 format without explaining how to convert from UTF-8 back to HTML. So I had do some research on my own.

UTF-8 is the format that allows using Unicode characters in ASCII text by embedding a special token, &#code;, into the text, where the code is Unicode code (in decimal format) for the symbol. For some symbols there are special names. An example " " is " "... You can jump to the specification if you need more examples.

Here is a UTF8ToHtml function, which converts from UTF-8 to HTML. The algorithm is not explained, but you can read more about it here.

//utf8 - pointer to UTF8 formatted text. dwSize - size of UTF8 text; ptr is the pointer to Output buffer.

//The OnClickedPastehtml is the handler for BN_CLICK event of the button in Dialog box. IDC_TEXT is the multiline text box.


void UTF8ToHtml(BYTE *utf8, DWORD dwSize, CHAR *ptr )
{
int code;
BYTE *end = utf8 + dwSize;
while( utf8 < end )
{
code = 0;
if( (*utf8 & 0xF0) == 0xF0 )
{
code = (((*utf8)&0x0F) << 18) | (((*(utf8+1))
& 0x7F)<<12) | (((*(utf8+2)) & 0x7F)<<6)
| ((*(utf8+3)) & 0x7F );
utf8+=3;
}
else
{
if( (*utf8 & 0xE0) == 0xE0 )
{
code = (((*utf8)&0x1F) << 12) | (((*(utf8+1))
& 0x7F)<<6 ) | ((*(utf8+2)) & 0x7F );
utf8+=2;
}
else
{
if( (*utf8 & 0xC0) == 0xC0 )
{
code = (((*utf8)&0x3F) << 6) | ((*(utf8+1)) & 0x7F) ;
utf8+=1;
}
}
}


if( code == 0 )
{
*ptr = *utf8;
}
else
{
char s[10];
switch(code)
{
case 160:
strcpy(s, "& ");
break;
case 34:
strcpy(s, "&");
break;
case 36:
strcpy( s, "&&");
break;
case 60:
strcpy( s, "&<");
break;
case 62:
strcpy( s, "&>");
break;
default:
sprintf( s, "&#%d;", code );
break;
}
strcpy( ptr, s );
ptr += strlen(s)-1;
}
utf8++;
ptr++;
}
*ptr = 0;
}
LRESULT CDialog::OnClickedPastehtml( WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled)
{
if (!OpenClipboard() )
return 0;
UINT uHtmlFormat = RegisterClipboardFormat("HTML Format");
UINT uFormat = uHtmlFormat;
if( IsClipboardFormatAvailable( uHtmlFormat ) == FALSE )
{
if( IsClipboardFormatAvailable( CF_TEXT ) == FALSE )
return 0;
uFormat = CF_TEXT;
}

HGLOBAL hglb;
LPTSTR lptstr;
hglb = GetClipboardData(uFormat);
if (hglb != NULL)
{
lptstr = (LPTSTR)GlobalLock(hglb);
if (lptstr != NULL)
{
char *ptr1 = strstr( lptstr, "<!--StartFragment-->");
if( ptr1 != 0 )
{
ptr1 += 20;
char * ptr2 = strstr( lptstr, "<!--EndFragment-->");
int iSize = (ptr2 - ptr1);
char * tmp = (char*)_alloca( iSize *2);
UTF8ToHtml((BYTE*)ptr1, iSize, tmp );
//memcpy(tmp, ptr1, iSize );
//tmp[iSize] = 0;
SetDlgItemText(IDC_TEXT, tmp );
}
else
SetDlgItemText(IDC_TEXT, lptstr );
GlobalUnlock(hglb);
}
}
CloseClipboard();
return 0;
}
这是我转换的代码
private void FTopMost_DragDrop(object sender, DragEventArgs e)
{
strCont = e.Data.GetData(DataFormats.Html, true).ToString();
int start = strCont.IndexOf("<!--StartFragment-->");
int end = strCont.IndexOf("<!--EndFragment-->");
string s = strCont.Substring(start + 20, end - start - 20);

FNewPost f = new FNewPost();
f.HTML = UTF8ToHtml(s);
f.Show();
f.Activate();
}
string UTF8ToHtml(string utf8)
{
string ptr = null;
int code;
for (int i = 0; i < utf8.Length; i++ )
{
code = 0;
if ((utf8[i]) == 0xF0)
{
code = (((utf8[i]) & 0x0F) << 18) | ((((utf8[i] + 1)) & 0x7F) << 12) | ((((utf8[i] + 2)) & 0x7F) << 6) | (((utf8[i] + 3)) & 0x7F);
i += 3;
}
else
{
if ((utf8[i]) == 0xE0)
{
code = (((utf8[i]) & 0x1F) << 12) | ((((utf8[i] + 1)) & 0x7F) << 6) | (((utf8[i] + 2)) & 0x7F);
i += 2;
}
else
{
if ((utf8[i]) == 0xC0)
{
code = (((utf8[i]) & 0x3F) << 6) | (((utf8[i] + 1)) & 0x7F);
i += 1;
}
}
}

if (code == 0)
{
ptr += utf8[i];
}
else
{
string s = null;
switch (code)
{
case 160:
s = "& ";
break;
case 34:
s = "&";
break;
case 36:
s = "&&";
break;
case 60:
s = "&<";
break;
case 62:
s = "&>";
break;
default:
//sprintf( s, "&#%d;", code );
s = "&" + code.ToString();
break;
}
ptr += s;
}
}
return ptr;
}
这是一段剪贴板数据,当然这里没有中文
Version:0.9
StartHTML:71
EndHTML:170
StartFragment:140
EndFragment:160
StartSelection:140
EndSelection:160
<!DOCTYPE>
<HTML>
<HEAD>
<TITLE>The HTML Clipboard</TITLE>
<BASE HREF="http://sample/specs">
</HEAD>
<BODY>
<!--StartFragment -->
<P>The Fragment</P>
<!--EndFragment -->
</BODY>
</HTML>
...全文
910 25 打赏 收藏 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
过来看看蛙蛙池塘,看到了这个帖子想答来着,后来逛cnblogs去了....嘿嘿
onlytiancai 2007-04-11
  • 打赏
  • 举报
回复
死eric猪头,就不给你分,气死你,哈哈哈

liugang831229() :你贴的代码是什么意思?有错误吗?

上午有朋友用反射查看了.net相关代码,发现.net在取剪贴板数据的时候有bug,是html就直接截取了,是unicode才用双字节编码。

2007-04-11 10:46:11 翔子
我早上看了会.net的DLL。发现你猜的是对的

2007-04-11 10:42:55 谁染枫林醉
怎么看的呀


2007-04-11 10:46:32 翔子
reflector



2007-04-11 10:47:07 翔子
text = new string((sbyte*) ptr);


2007-04-11 10:47:18 翔子
它就是这么转的

2007-04-11 10:47:27 翔子
if (unicode)
{
return new string((char*) ptr);
}
text = new string((sbyte*) ptr);

2007-04-11 10:47:49 翔子
Html的时候unicode定成了false


2007-04-11 10:44:51 谁染枫林醉
是吗?


2007-04-11 10:45:01 谁染枫林醉
你反射的哪条东西呀?


2007-04-11 10:48:33 翔子
你的WebEdit的webBrowser1.Navigate(Url);

2007-04-11 10:45:05 谁染枫林醉
哪个DLL呀


2007-04-11 10:45:13 谁染枫林醉
什么?


2007-04-11 10:49:08 翔子
public class DataObject : IDataObject, UnsafeNativeMethods.IOleDataObject


2007-04-11 10:45:45 谁染枫林醉
private void FNewPost_Load(object sender, EventArgs e)
{
webEdit.DocumentText = "<html><body contentEditable='true'></body></html>";
}


2007-04-11 10:46:00 谁染枫林醉
你反射的这个?


2007-04-11 10:49:33 翔子


2007-04-11 10:46:23 谁染枫林醉
在哪个DLL里呀


2007-04-11 10:49:59 翔子
从那个事件的E里一路找下去的

2007-04-11 10:46:45 谁染枫林醉
if (unicode)
{
return new string((char*) ptr); 这些代码是哪个方法?


2007-04-11 10:47:30 谁染枫林醉
是不是说unicode就用char转,而不是unicode就直接用sbyte转了呀,这块儿原理不太懂呀


2007-04-11 10:51:20 翔子
我也不太懂,不过,看起来,它就是写死了

2007-04-11 10:48:04 谁染枫林醉
那怎么重写这个过程呢


2007-04-11 10:51:38 翔子
不可能

2007-04-11 10:48:15 谁染枫林醉
为什么


2007-04-11 10:48:25 谁染枫林醉
这算bug了,一定能解决。


2007-04-11 10:51:54 翔子
我也想重写来着,他用的方法全是internal

2007-04-11 10:48:33 谁染枫林醉
我日


2007-04-11 10:52:03 翔子
外部不让有

2007-04-11 10:48:54 谁染枫林醉
那有没有相关事件可以挂接处理


2007-04-11 10:52:55 翔子
DataFormats.UnicodeText 可以得到正确文本,但,没有HTML

2007-04-11 10:49:36 谁染枫林醉
我知道的


2007-04-11 10:53:14 翔子
传说中只能调API来干活了

2007-04-11 10:53:42 翔子
用API来模拟他GetData()

2007-04-11 10:50:22 谁染枫林醉
那个我有相关资料的


2007-04-11 10:53:52 翔子
得到系统中的数据

2007-04-11 10:50:29 谁染枫林醉



2007-04-11 10:54:32 翔子
关键是得到未处理的系统剪切数据

2007-04-11 10:53:22 谁染枫林醉
恩,等下,我找找


2007-04-11 11:02:05 翔子
你的方法确实绝啊!呵呵

2007-04-11 10:58:53 谁染枫林醉
呵呵,没办法,弄了三天了,急死了快


2007-04-11 11:04:13 翔子
呵呵,是啊,可以说成是.net的BUG了

2007-04-11 11:01:29 谁染枫林醉
找不到相关的文档了我,你查下相关win32api吧,应该有的
可爱的排骨 2007-04-11
  • 打赏
  • 举报
回复
才多久时间没见,你Y笨蛙就连这么简单的问题都不会了,靠. 以后不要和别人讲我认识你啊.....
liugang831229 2007-04-11
  • 打赏
  • 举报
回复
string UTF8ToHtml(string utf8)
{
string ptr = null;
int code;
byte[] utf8bytes = Encoding.UTF8.GetBytes(utf8);

for (int i = 0; i < utf8bytes.Length; i++)
{
code = 0;
if ((utf8bytes[i] & 0xF0) == 0xF0)
{
code = ((utf8bytes[i] & 0x0F) << 18) |
((utf8bytes[i + 1] & 0x7F) << 12) |
((utf8bytes[i + 2] & 0x7F) << 6) |
(utf8bytes[i + 3] & 0x7F);
i += 3;
}
else
{
if ((utf8bytes[i] & 0xE0) == 0xE0)
{
code = ((utf8bytes[i] & 0x1F) << 12) |
((utf8bytes[i + 1] & 0x7F) << 6) |
(utf8bytes[i + 2] & 0x7F);
i += 2;
}
else
{
if ((utf8bytes[i]) == 0xC0)
{
code = (((utf8bytes[i]) & 0x3F) << 6) |
((utf8bytes[i + 1]) & 0x7F);
i += 1;
}
}
}

if (code == 0)
{
ptr += (char)utf8bytes[i];
}
else
{
string s = null;
switch (code)
{
case 160:
s = "& ";
break;
case 34:
s = "&";
break;
case 36:
s = "&&";
break;
case 60:
s = "&<";
break;
case 62:
s = "&>";
break;
default:
//sprintf( s, "&#%d;", code );
s = "&#" + code.ToString() + ";";
break;
}
ptr += s;
}
}
return ptr;
}
liugang831229 2007-04-11
  • 打赏
  • 举报
回复
好长呀。
可爱的排骨 2007-04-11
  • 打赏
  • 举报
回复
死呱,帮你顶贴竟然不给分.X你Y的
onlytiancai 2007-04-11
  • 打赏
  • 举报
回复
死eric猪头,
我问题解决了,详见以下网址
http://www.cnblogs.com/onlytiancai/archive/2007/04/10/706543.html
yuan731 2007-04-10
  • 打赏
  • 举报
回复
支持,分少了
storm0912 2007-04-10
  • 打赏
  • 举报
回复
多给点分啊
onlytiancai 2007-04-10
  • 打赏
  • 举报
回复
你那样编码再解码有啥意义呀
王集鹄 2007-04-10
  • 打赏
  • 举报
回复
太长了,也就只给10分,看你三角也多就给你点一下吧

C 里面是 BYTE *utf8
在C#里就得先用Encoding.UTF8.GetBytes()得到Byte数组
用Encoding.UTF8.GetString();返回
onlytiancai 2007-04-10
  • 打赏
  • 举报
回复
不算长吧,几行而已。
jp800308 2007-04-10
  • 打赏
  • 举报
回复
呵呵,这么长的东西,没时间弄
onlytiancai 2007-04-10
  • 打赏
  • 举报
回复
经测试,你的代码不符合要求,达不到效果
kaihuababy 2007-04-10
  • 打赏
  • 举报
回复
分是不是都是别人给的?
onlytiancai 2007-04-10
  • 打赏
  • 举报
回复
呵呵,你好像就给我改了一句吧,我晚上回去测试一下,如果成功的话就给你分撒,不过你要给我说下编码的原理哦。

ssdx(未来啊未来)
你的英文我不懂,有中文吗?我只能看个大概,不能准确理解。
onlytiancai 2007-04-10
  • 打赏
  • 举报
回复
好,谢谢,明白了,以后遵循一下这规则
ssdx 2007-04-10
  • 打赏
  • 举报
回复
Martin,

HTML4 can be UTF-8; just serve it as content-type: text/html;
charset=utf-8. Alternatively put a META tag in the header that
declares it as such. Long ago HTML was restricted to Latin1 but that
is history. (Maybe there is more to this than you are telling us?)

Anyway, if you really want to convert Unicode to latin1 + html
character entities, I believe that GNU recode can do what you want:
GXY2005 2007-04-10
  • 打赏
  • 举报
回复
没听到小学生整天念叨:分,分是命根!
onlytiancai 2007-04-10
  • 打赏
  • 举报
回复
大家给指导一下思路也行,谢谢,不用你们写了,给说说思路或者翻译一下那段英文也行,哥们快急了。
加载更多回复(5)
下载代码方式:https://pan.quark.cn/s/c66ecb4d06ce 同源策略:从安全角度出发,浏览器会对脚本发起的跨站请求施加限制,要求JavaScript或Cookie仅能获取同源(即协议、域名和端口完全一致)下的资源。正因如此,不同项目间的调用会受到浏览器的阻碍。以常见情境为例:WebApi作为数据服务层,它是一个独立的项目,而MVC项目则承担Web的展示功能,此时MVC项目需要调用WebApi中的接口以获取数据并在页面上呈现。由于WebApi与MVC属于两个独立的项目,运行后便会产生前面提及的跨域问题。WebApi的跨域问题主要源于浏览器的同源策略,这是一种安全措施,旨在限制JavaScript或Cookie仅能访问同一源(包括协议、域名和端口)下的内容。在实际开发过程中,当WebApi作为一个独立服务,例如数据服务层,而MVC项目作为前端展示层时,两者运行在不同的项目和端口下,浏览器将阻止MVC对WebApi的跨域请求,从而影响数据的正常获取。为了应对这一问题,我们可以采用CORS(跨域资源共享)机制。CORS通过在HTTP请求与响应头中嵌入特定标识,向浏览器明确哪些跨域请求是被允许的。例如,服务器可以在响应头中添加`Access-Control-Allow-Origin:http://localhost:8081`,表示允许来自http://localhost:8081的请求访问资源。解决WebApi跨域问题的具体实施步骤如下: 1. 构建一个包含MVC项目(Web)与Web API项目(WebApiCORS)的解决方案。 2. 在MVC项目中,例如Home控制器的Index视图,通过Ajax向WebApiCORS发起跨域请求。 3...

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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