我用的是新浪微博,发了三条内容如下:
通过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; }