C#下默认的是unicode编码
但是比如,我使用以下代码,从某网站上下载网页,而该网页是Utf-8编码的,这时,显示出来的中文就乱码了。
string sHtml = client.DownloadString(sUrl);
经过多方尝试,我用下列操作搞出来了正确的编码了,但是其中的原理,我并不明白。
byte[] byteArray = Encoding.Default.GetBytes(sHtml);
string s1 = System.Text.Encoding.UTF8.GetString(byteArray);
后来又发现,这样处理,大部分字符显示出来了,但某些字符转换不正确。
正确的方法应该是
C#下载utf-8的网页
WebClient client = new WebClient();
byte[] byteArray= client.DownloadData(sUrl);
string sHtml = Encoding.UTF8.GetString(byteArray);
有时候总搞不清楚,总以为UTF-8就是unicode,实际是,utf-8也是一种MultiBytes编码,gbk也是一个MultiBytes编码,而Unicode是WideChar编码。
闲话不多说了,要将 utf-8转成gk,写了一个 高温磁力泵函数以方便使用。
void Utf2gb(const char *utf,char *gb)
{
int nLen = strlen(utf);
WCHAR * szUnicode = new WCHAR[nLen+1];
char * szAnsi = new char[nLen+1];
int nWCHAR=MultiByteToWideChar(CP_UTF8,0,utf,nLen,szUnicode,nLen);
int nSize=WideCharToMultiByte(CP_ACP,0,szUnicode,nWCHAR,szAnsi,nLen,NULL,NULL);
szAnsi[nSize]=0;
strcpy( gb,szAnsi);
delete szUnicode;
delete szAnsi;
}
调用示例:
char szUTF[]="鎴戠殑";
Utf2gb(szUTF,szUTF);
当然,你的两个参数不一样,也是OK的。
看到论坛有人在问如何编程登录有验证码的 高温磁力泵网站题,于是专门研究了一下。文章后有源码下载地址。
注:验证码还是要人来辨认。
有几种处理办法,一是使用WebBrowser控件,一是使用WebClient或者WebRequest控件来处理。
本文中使用 WebBrowser 控件。
(以优快云登录为例)
这里有两个难点:
1,如何获得验证码的图片。
2,如果模拟表单提交。
先做一些准备工作,即通过察看登录页的源码码,查出用户名等控件的name.
验证码的控件的name是MzImgExpPwd
提交按钮是一个图片,name是 ctl00$CPH_Content$Image_Login
添加引用 Microsft.mshtml
获得验证码的关键代码
HTMLDocument html = (HTMLDocument)this.webBrowser1.Document.DomDocument;
HtmlElement elm = (HtmlElement)webBrowser1.Document.All["MzImgExpPwd"];
IHTMLControlElement img = (IHTMLControlElement)elm.DomElement;
IHTMLControlRange range = (IHTMLControlRange)((HTMLBody)html.body).createControlRange();
range.add(img);
range.execCommand("Copy", false, null);
img = null;
range = null;
html = null;
if(Clipboard.ContainsImage())
{ http://www.dcci.com.cn/
this.pictureBox1.Image = Clipboard.GetImage();
}
else
{
MessageBox.Show("执行不成功");
}
Clipboard.Clear();
提交的关键代码
webBrowser1.Document.All["ctl00$CPH_Content$tb_LoginNameOrLoginEmail"].InnerText = textBox1.Text;
webBrowser1.Document.All["ctl00_CPH_Content_tb_Password"].InnerText = textBox2.Text;
webBrowser1.Document.All["ctl00$CPH_Content$tb_ExPwd"].InnerText = textBox3.Text;
webBrowser1.Document.All["ctl00$CPH_Content$Image_Login"].InvokeMember("click");
但是比如,我使用以下代码,从某网站上下载网页,而该网页是Utf-8编码的,这时,显示出来的中文就乱码了。
string sHtml = client.DownloadString(sUrl);
经过多方尝试,我用下列操作搞出来了正确的编码了,但是其中的原理,我并不明白。
byte[] byteArray = Encoding.Default.GetBytes(sHtml);
string s1 = System.Text.Encoding.UTF8.GetString(byteArray);
后来又发现,这样处理,大部分字符显示出来了,但某些字符转换不正确。
正确的方法应该是
C#下载utf-8的网页
WebClient client = new WebClient();
byte[] byteArray= client.DownloadData(sUrl);
string sHtml = Encoding.UTF8.GetString(byteArray);
有时候总搞不清楚,总以为UTF-8就是unicode,实际是,utf-8也是一种MultiBytes编码,gbk也是一个MultiBytes编码,而Unicode是WideChar编码。
闲话不多说了,要将 utf-8转成gk,写了一个 高温磁力泵函数以方便使用。
void Utf2gb(const char *utf,char *gb)
{
int nLen = strlen(utf);
WCHAR * szUnicode = new WCHAR[nLen+1];
char * szAnsi = new char[nLen+1];
int nWCHAR=MultiByteToWideChar(CP_UTF8,0,utf,nLen,szUnicode,nLen);
int nSize=WideCharToMultiByte(CP_ACP,0,szUnicode,nWCHAR,szAnsi,nLen,NULL,NULL);
szAnsi[nSize]=0;
strcpy( gb,szAnsi);
delete szUnicode;
delete szAnsi;
}
调用示例:
char szUTF[]="鎴戠殑";
Utf2gb(szUTF,szUTF);
当然,你的两个参数不一样,也是OK的。
看到论坛有人在问如何编程登录有验证码的 高温磁力泵网站题,于是专门研究了一下。文章后有源码下载地址。
注:验证码还是要人来辨认。
有几种处理办法,一是使用WebBrowser控件,一是使用WebClient或者WebRequest控件来处理。
本文中使用 WebBrowser 控件。
(以优快云登录为例)
这里有两个难点:
1,如何获得验证码的图片。
2,如果模拟表单提交。
先做一些准备工作,即通过察看登录页的源码码,查出用户名等控件的name.
验证码的控件的name是MzImgExpPwd
提交按钮是一个图片,name是 ctl00$CPH_Content$Image_Login
添加引用 Microsft.mshtml
获得验证码的关键代码
HTMLDocument html = (HTMLDocument)this.webBrowser1.Document.DomDocument;
HtmlElement elm = (HtmlElement)webBrowser1.Document.All["MzImgExpPwd"];
IHTMLControlElement img = (IHTMLControlElement)elm.DomElement;
IHTMLControlRange range = (IHTMLControlRange)((HTMLBody)html.body).createControlRange();
range.add(img);
range.execCommand("Copy", false, null);
img = null;
range = null;
html = null;
if(Clipboard.ContainsImage())
{ http://www.dcci.com.cn/
this.pictureBox1.Image = Clipboard.GetImage();
}
else
{
MessageBox.Show("执行不成功");
}
Clipboard.Clear();
提交的关键代码
webBrowser1.Document.All["ctl00$CPH_Content$tb_LoginNameOrLoginEmail"].InnerText = textBox1.Text;
webBrowser1.Document.All["ctl00_CPH_Content_tb_Password"].InnerText = textBox2.Text;
webBrowser1.Document.All["ctl00$CPH_Content$tb_ExPwd"].InnerText = textBox3.Text;
webBrowser1.Document.All["ctl00$CPH_Content$Image_Login"].InvokeMember("click");