今天精神不太好,突然想到如何针对weibo的内容做流量过滤,以前做过应用识别方面的东西,对这方面比较熟悉,于是安装wireshark抓包,看看在微博上发消息数据包到底是什么样子的。
与原程序比较,在cIn<=0xdf、cIn<=0xef、cIn<=0xf7这三处我加上了等号,因为输出时发现,","的UTF-8正好是0xEF,0xBC,0x8C,如果没有等号,转换会有问题。另外在输出时,通过locale头文件中的setlocale函数设置一下,才能在控制台中正确输出汉字。(参考: http://apps.hi.baidu.com/share/detail/18550951)
我用的是新浪微博,发了三条内容如下:
通过wireshark过滤找到了相应的session,对应包的内容截图大致如下:
通过特征字段:"Host: weibo.com"+"POST /mblog/publish.php"可以确定这个session是由新浪微博用户发消息时产生的,然后直接通过两个换行"0d 0a 0d 0a",定位到content字段,截取后面的内容进行相应的过滤判断即可。
这里再来看看content字段的具体内容:(在网络传输过程中采用的是UTF-8编码,见红色部分)
%E5%A5%BD%E4%B9%85%E6%B2%A1%E4%B8%8A%E4%BA%86%EF%BC%8C%E7%9C%8B%E7%9C%8B%E3%80%82
好久没上了,看看。
aaaa
aaaa
a%E5%95%8A1%E4%B8%80%24%E7%9C%8B%E7%9C%8B
a啊1一$看看
一直没弄清编码转换的原理,于是又在网上进行了相关内容的查阅,可参考阮一峰的文章,很通俗易懂:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
然后自己又编程验证了下,用到了以前保存的一份代码:
#include "stdafx.h"
#include <locale>
//来自http://www.cppblog.com/fdsajhg/archive/2010/09/03/125770.aspx
// --------- UTF-8转Unicode,单字 ----------------
int cU8xU(wchar_t* pOut,const unsigned char *pText){
int ret = 0;
char* uchar = (char *)pOut;
unsigned cIn = (unsigned char)pText[0];
if(cIn<0x80){ // ASCII 0x00 ~ 0x7f
pOut[0] = pText[0];
}else if(cIn<=0xdf){
uchar[0] = (pText[0]<<6)|(pText[1]&0x3f);
uchar[1] = (pText[0]>>2)&0x0f;
ret = 1;
}else if(cIn<=0xef){
uchar[0] = (pText[1]<<6)|(pText[2]&0x3f);
uchar[1] = (pText[0]<<4)|((pText[1]>>2)&0x0f);
ret = 2;
}else if(cIn<=0xf7){
uchar[0] = (pText[2]<<6)|(pText[3]&0x3f);
uchar[1] = (pText[1]<<4)|((pText[2]>>2)&0x0f);
uchar[2] = ((pText[0]<<2)&0x1c)|((pText[1]>>4)&0x03);
ret = 3;
}
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char namecn[] = {0xE5,0xA5,0xBD,0xE4,0xB9,0x85,0xE6,0xB2,0xA1,0xE4,0xB8,0x8A,0xE4,0xBA,0x86,0xEF,0xBC,0x8C,0xE7,0x9C,0x8B,0xE7,0x9C,0x8B,0xE3,0x80,0x82};
wchar_t res[100];
memset(res, 0 , 100);
for(int i=0, j=0;i<sizeof(namecn);i++,j++){
if(namecn[i]<0x80){
res[j] = namecn[i];
}else{
i += cU8xU(&res[j],&namecn[i]);
}
}
setlocale(LC_ALL, "chs");
wprintf(L"%s\n",res);
return 0;
}
与原程序比较,在cIn<=0xdf、cIn<=0xef、cIn<=0xf7这三处我加上了等号,因为输出时发现,","的UTF-8正好是0xEF,0xBC,0x8C,如果没有等号,转换会有问题。另外在输出时,通过locale头文件中的setlocale函数设置一下,才能在控制台中正确输出汉字。(参考: http://apps.hi.baidu.com/share/detail/18550951)