Archive for the ‘技术’ Category

浅谈字符集

强烈推荐一篇文章:理解字符编码

在写程序的过程中,字符集的问题遇到过N多。查查改改,解决问题,一直没有总结。这段时间做J2EE的项目,遇到了更多的字符集问题,在解决的过程中收获不少。写篇文章浅谈下字符集问题。

个人将字符集粗分为两大类:ASCII和UNICODE。简单介绍下它们:

众所周知,计算机是美国人发明的。因此,为了方便使用计算机,那么计算机起码要能表达他们(美国人)的语言。这也就是ASCII(美国信息交换标准代码)的由来了。计算机的最小信息单位是位(bit),但更常用的基本信息单位是字节(Byte),它们之间的转换是1Byte = 8bits(为什么是8而不是2、4、16等,我就不得而知了)。ASCII又分基础的(7位,最高位用作奇偶校验)和扩展的(8位),最多能表示256个字符。这对于表示全世界的语言字符是不可能的,因此有了UNICODE。

UNICODE简单的来说就是,用两个字节(16位)来表示一个字符。但是基于不同的考虑(如存储空间)又有UTF-8、UTF-16、UTF-32等不同的格式,这里就不详细介绍了。

正是ASCII和UNICODE给我们带来了字符集问题。一个比较好的程序,应该要能支持UNICODE。对于我们(中国人),更是如此,因为我们使用的是汉字而不是英文。接下来,我要以一个不完全的Java Web Server例子来说说个人的理解。

OS(Windows、Unix、Linux等)、Java、MySQL在全世界流行,因此很容易预见到它们都是支持ASCII和UNICODE的。先说说OS,个人用的是Windows XP(中文版)(Windows对于本地化的支持有个“代码页”的概念,在此不详细介绍),很容易知道OS的字符集是UNICODE的GBK。对于运行在该OS上的Java平台,也是如此。而MySQL对字符集的支持主要表现在它的存储。

在例子中,MySQL采用latin1(称之为ASCII或者ISO-8859-1都行),而JSP采用GB2312。

问题一:JSP page指令中的pageEncoding属性指定的字符集是指该JSP页面被打开时,OS用哪种字符集格式读取。这就相当于你在记事本里写篇文字(即有英文又有中文),保存的格式。如果为ASCII,则中文会丢失原有的信息,为UNICODE则能正常显示。因此,其实只要你在该JSP里面的注释仅有英文,是可以设置该属性为ISO-8859-1的。

问题二:JSP page指令中的contentType="text/html;charset=gb2312"和HTML中的<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />意思一样,都是指该页面由浏览器解析时采用的字符集。

问题三:Java中所有字符都是两个字节,无论是ASCII还是UNICODE,但是建议你不要简单地认为它就是UNICODE。而网络上传输的字符是ISO-8859-1(1Byte)的(因为网络传输是基于字节流的)。所以前一个JSP页面的中文参数采用POST方法传到后一个页面接收后,它是乱码。详细:一个汉字两个字节都有数据**(GB2312),网络传输成* *(ISO-8859-1),后一个页面接收后成#* #*(GB2312)两个汉字四个字节。(*表示数据,#表示未知,空格表示字符间隔)当然乱码了。重新组合下new String(data.getBytes("ISO-8859-1"))就好了(默认采用页面charset编码组合即GB2312)。采用GET方法则要在前一个页面先将中文编码后再在URL中传递参数:String msg = java.net.URLEncoder.encode("中文", "UTF-8");在后一个页面取得msg后,对应的使用new String(msg.getBytes("ISO-8859-1"), "UTF-8")或者java.net.UREDecoder.decode(msg, "UTF-8");。

Read more

HTML <label> <span>

<label> 标签为 input 元素定义标注(标记)。

label 元素不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果您在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。

<label> 标签的 for 属性应当与相关元素的 id 属性相同。

<form>
  <label for="male">Male</label>
  <input type="radio" name="sex" id="male" />
  <br />
  <label for="female">Female</label>
  <input type="radio" name="sex" id="female" />
</form>

<span> 标签被用来组合文档中的行内元素。

span 没有固定的格式表现。当对它应用样式时,它才会产生视觉上的变化。如果不对 span 应用样式,那么 span 元素中的文本与其他文本不会任何视觉上的差异。

SMTP

参考资料:

http://hi.baidu.com/kwunkuklan/blog/item/455f121749120a044b90a75e.html

http://tool.chinaz.com/Tools/Base64.aspx

TCP/IP课要求写个程序用SMTP发送一封邮件。telnet试验了下163和新浪的SMTP。下面为过程(163的SMTP貌似有限制,新浪的可以发送成功):

telnet smtp.163.com 25
HELO 163.com
AUTH LOGIN
dXNlcm5hbWU6(username:)
base64加密后的用户名
UGFzc3dvcmQ6(Password:)
base64加密后的密码

telnet smtp.sina.com.cn 25
HELO
AUTH LOGIN
VXNlcm5hbWU6(Username:)
base64加密后的用户名
UGFzc3dvcmQ6(Password:)
base64加密后的密码
MAIL FROM: <***@sina.com.cn>//邮件发送地址,不可伪造
RCPT TO: <***@qq.com>//目的地址
DATA
TO://目的地址,可伪造
FROM://发送地址,可伪造
SUBJECT:
.
QUIT

注意:可能小小的输入错误都会导致操作不成功。代码暂时就不贴了。

ActiveX自启动

//检查HKEY_LOCAL_MACHINE中是否已存在该注册表项
bool exist()
{
HKEY hkResult;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("Software\\Microsoft\\Active Setup\\Installed Components\\{FECFCB51-0975-8171-1FB0-B5C091251604}"),
0, KEY_ALL_ACCESS, &hkResult) == ERROR_SUCCESS) {
printf("该注册表项已存在!\n");
return true;
}
return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
//已存在则删除
if(exist()) {
if (RegDeleteKey(HKEY_LOCAL_MACHINE,
TEXT("Software\\Microsoft\\Active Setup\\Installed Components\\{FECFCB51-0975-8171-1FB0-B5C091251604}")) == ERROR_SUCCESS) {
//以下删除HKEY_CURRENT_USER中该注册表项。
//很重要,删除才能再次使用该注册表项实现自动启动。
//ActiveX的自动启动过程?
RegDeleteKey(HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Active Setup\\Installed Components\\{FECFCB51-0975-8171-1FB0-B5C091251604}"));
printf("注册表项删除成功!\n");
} else {
printf("注册表项删除失败!\n");
}
}
//获取exe程序运行路径
TCHAR szPath[MAX_PATH];
ZeroMemory(szPath, sizeof(szPath));
GetModuleFileName(NULL, szPath, MAX_PATH);
//创建注册表项
HKEY hkResult;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
TEXT("Software\\Microsoft\\Active Setup\\Installed Components\\{FECFCB51-0975-8171-1FB0-B5C091251604}"),
0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkResult, NULL) == ERROR_SUCCESS) {
RegSetValueEx(hkResult, TEXT("StubPath"), 0, REG_SZ, (BYTE*)szPath, (lstrlen(szPath)+1)*2);
printf("注册表项创建或打开成功!\n");
RegCloseKey(hkResult);
} else {
printf("注册表项创建或打开失败!\n");
}
//暂停下
MessageBox(NULL, TEXT("RegTest"), TEXT("RegTest"), MB_OK);
return 0;
}

参考资料:http://www.feihack.com/article.asp?id=3

http://bbs.eyuyan.com/dispbbs.asp?boardid=124&id=192209

网络爬虫参考资料

http://g.csdn.net/5029360

http://subject.csdn.net/spider.htm

http://news.csdn.net/n/20071015/109604.html

无觅相关文章插件,快速提升流量