wget使用详解(转)
[ 2006/05/29 23:25 | by ipaddr ]
wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上。它有以下功能和特点:
(1)支持断点下传功能;这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;
(2)同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;
(3)支持代理服务器;对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
(4)设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
(5)程序小,完全免费;程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的;
wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget [参数列表] URL。下面就结合具体的例子来说明一下wget的用法。
1、下载整个http或者ftp站点。
wget http://place.your.url/here
这个命令可以将http://place.your.url/here 首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。
wget -r http://place.your.url/here
这个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址 同样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-l number参数来指定 下载的层次。例如只下载两层,那么使用-l 2。
要是您想制作镜像站点,那么可以使用-m参数,例如:wget -m http://place.your.url/here
这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。
2、断点续传。
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:
wget -c http://the.url.of/incomplete/file
使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。
3、批量下载。
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:wget -i download.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)
4、选择性的下载。
可以指定让wget只下载一类文件,或者不下载什么文件。例如:
wget -m --reject=gif http://target.web.site/subdirectory
表示下载http://target.web.site/subdirectory ,但是忽略gif文件。--accept=LIST 可以接受的文件类型,--reject=LIST拒绝接受的文件类型。
5、密码和认证。
wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
--http-user=USER设置HTTP用户
--http-passwd=PASS设置HTTP密码
对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。
6、利用代理服务器进行下载。
如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:
http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080
分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
--proxy-user=USER设置代理用户
--proxy-passwd=PASS设置代理密码
这两个参数。
使用参数--proxy=on/off 使用或者关闭代理。
wget还有很多有用的功能,需要用户去挖掘。
附录:
命令格式:
wget [参数列表] [目标软件、网页的网址]
-V,--version 显示软件版本号然后退出;
-h,--help显示软件帮助信息;
-e,--execute=COMMAND 执行一个 “.wgetrc”命令
-o,--output-file=FILE 将软件输出信息保存到文件;
-a,--append-output=FILE将软件输出信息追加到文件;
-d,--debug显示输出信息;
-q,--quiet 不显示输出信息;
-i,--input-file=FILE 从文件中取得URL;
-t,--tries=NUMBER 是否下载次数(0表示无穷次)
-O --output-document=FILE下载文件保存为别的文件名
-nc, --no-clobber 不要覆盖已经存在的文件
-N,--timestamping只下载比本地新的文件
-T,--timeout=SECONDS 设置超时时间
-Y,--proxy=on/off 关闭代理
-nd,--no-directories 不建立目录
-x,--force-directories 强制建立目录
--http-user=USER设置HTTP用户
--http-passwd=PASS设置HTTP密码
--proxy-user=USER设置代理用户
--proxy-passwd=PASS设置代理密码
-r,--recursive 下载整个网站、目录(小心使用)
-l,--level=NUMBER 下载层次
-A,--accept=LIST 可以接受的文件类型
-R,--reject=LIST拒绝接受的文件类型
-D,--domains=LIST可以接受的域名
--exclude-domains=LIST拒绝的域名
-L,--relative 下载关联链接
--follow-ftp 只下载FTP链接
-H,--span-hosts 可以下载外面的主机
-I,--include-directories=LIST允许的目录
-X,--exclude-directories=LIST 拒绝的目录
中文文档名在平常的情况下会被编码, 但是在 --cut-dirs 时又是正常的,
wget -r -np -nH --cut-dirs=3 ftp://host/test/
测试.txt
wget -r -np -nH -nd ftp://host/test/
%B4%FA%B8%D5.txt
wget "ftp://host/test/ *"
%B4%FA%B8%D5.txt
由於不知名的原因,可能是为了避开特殊档名, wget 会自动将抓取档名的部分用 encode_string 处理过, 所以该 patch 就把被 encode_string 处理成 "%3A" 这种东西, 用 decode_string 还原成 ":", 并套用在目录与档案名称的部分, decode_string 是 wget 内建的函式。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
(1)支持断点下传功能;这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;
(2)同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;
(3)支持代理服务器;对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
(4)设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
(5)程序小,完全免费;程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的;
wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget [参数列表] URL。下面就结合具体的例子来说明一下wget的用法。
1、下载整个http或者ftp站点。
wget http://place.your.url/here
这个命令可以将http://place.your.url/here 首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。
wget -r http://place.your.url/here
这个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址 同样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-l number参数来指定 下载的层次。例如只下载两层,那么使用-l 2。
要是您想制作镜像站点,那么可以使用-m参数,例如:wget -m http://place.your.url/here
这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。
2、断点续传。
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:
wget -c http://the.url.of/incomplete/file
使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。
3、批量下载。
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:wget -i download.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)
4、选择性的下载。
可以指定让wget只下载一类文件,或者不下载什么文件。例如:
wget -m --reject=gif http://target.web.site/subdirectory
表示下载http://target.web.site/subdirectory ,但是忽略gif文件。--accept=LIST 可以接受的文件类型,--reject=LIST拒绝接受的文件类型。
5、密码和认证。
wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
--http-user=USER设置HTTP用户
--http-passwd=PASS设置HTTP密码
对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。
6、利用代理服务器进行下载。
如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:
http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080
分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
--proxy-user=USER设置代理用户
--proxy-passwd=PASS设置代理密码
这两个参数。
使用参数--proxy=on/off 使用或者关闭代理。
wget还有很多有用的功能,需要用户去挖掘。
附录:
命令格式:
wget [参数列表] [目标软件、网页的网址]
-V,--version 显示软件版本号然后退出;
-h,--help显示软件帮助信息;
-e,--execute=COMMAND 执行一个 “.wgetrc”命令
-o,--output-file=FILE 将软件输出信息保存到文件;
-a,--append-output=FILE将软件输出信息追加到文件;
-d,--debug显示输出信息;
-q,--quiet 不显示输出信息;
-i,--input-file=FILE 从文件中取得URL;
-t,--tries=NUMBER 是否下载次数(0表示无穷次)
-O --output-document=FILE下载文件保存为别的文件名
-nc, --no-clobber 不要覆盖已经存在的文件
-N,--timestamping只下载比本地新的文件
-T,--timeout=SECONDS 设置超时时间
-Y,--proxy=on/off 关闭代理
-nd,--no-directories 不建立目录
-x,--force-directories 强制建立目录
--http-user=USER设置HTTP用户
--http-passwd=PASS设置HTTP密码
--proxy-user=USER设置代理用户
--proxy-passwd=PASS设置代理密码
-r,--recursive 下载整个网站、目录(小心使用)
-l,--level=NUMBER 下载层次
-A,--accept=LIST 可以接受的文件类型
-R,--reject=LIST拒绝接受的文件类型
-D,--domains=LIST可以接受的域名
--exclude-domains=LIST拒绝的域名
-L,--relative 下载关联链接
--follow-ftp 只下载FTP链接
-H,--span-hosts 可以下载外面的主机
-I,--include-directories=LIST允许的目录
-X,--exclude-directories=LIST 拒绝的目录
中文文档名在平常的情况下会被编码, 但是在 --cut-dirs 时又是正常的,
wget -r -np -nH --cut-dirs=3 ftp://host/test/
测试.txt
wget -r -np -nH -nd ftp://host/test/
%B4%FA%B8%D5.txt
wget "ftp://host/test/ *"
%B4%FA%B8%D5.txt
由於不知名的原因,可能是为了避开特殊档名, wget 会自动将抓取档名的部分用 encode_string 处理过, 所以该 patch 就把被 encode_string 处理成 "%3A" 这种东西, 用 decode_string 还原成 ":", 并套用在目录与档案名称的部分, decode_string 是 wget 内建的函式。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
阳光总在风雨后....
很多不可能的事情,换个角度思考也许就不一样了。
>>>>
很多不可能的事情,换个角度思考也许就不一样了。
>>>>
Windows下PHPMyAdmin错误"没有发现 PHP 的扩展设置mbstring"
[ 2006/05/24 23:26 | by ipaddr ]
Windows下安装Apache,PHP,Mysql,PHPMyAdmin,
PHPMyAdmin提示没有发现 PHP 的扩展设置mbstring,主要原因是PHP不支持mbstring
解决办法:
1.Nix下,编译PHP时加上mbstring支持
2.Windows下,配置php.ini
extension_dir = "c:/php/extensions/"
(建议写全路径,并且,后面要带/)
extension=php_mbstring.dll
可能通过查看phpinfo();来确认php.ini的位置以及PHP当前支持的一些特性。
>>>>>>>>>>>>>>>>>
PHPMyAdmin提示没有发现 PHP 的扩展设置mbstring,主要原因是PHP不支持mbstring
解决办法:
1.Nix下,编译PHP时加上mbstring支持
2.Windows下,配置php.ini
extension_dir = "c:/php/extensions/"
(建议写全路径,并且,后面要带/)
extension=php_mbstring.dll
可能通过查看phpinfo();来确认php.ini的位置以及PHP当前支持的一些特性。
>>>>>>>>>>>>>>>>>
微软一个罕为人知的无敌命令(转载)
[ 2006/05/15 23:30 | by ipaddr ]
问:怎么才能关掉一个用任务管理器关不了的进程?我前段时间发现我的机子里多了一个进程,只要开机就在,我用任务管理器却怎么关也关不了。
答1:杀进程很容易,随便找个工具都行。比如IceSword。关键是找到这个进程的启动方式,不然下次重启它又出来了。顺便教大家一招狠的。其实用Windows自带的工具就能杀大部分进程:
c:>ntsd -c q -p PID
只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。ntsd从2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd自动就获得了debug权限,从而能杀掉大部分的进程。ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c参数从命令行传递就行了。Ntsd 按照惯例也向软件开发人员提供。只有系统开发人员使用此命令。用法:开个cmd.exe窗口,输入:
ntsd -c q -p PID
把最后那个PID,改成你要终止的进程的ID。如果你不知道进程的ID,任务管理器->进程选项卡->查看->选择列->勾上"PID(进程标识符)",然后就能看见了。
答2:xp下还有两个好东东tasklist和tskill。tasklist能列出所有的进程,和相应的信息。tskill能查杀进程,语法很简单:tskill 程序名!!
>>>>>>>>>>>>>>
答1:杀进程很容易,随便找个工具都行。比如IceSword。关键是找到这个进程的启动方式,不然下次重启它又出来了。顺便教大家一招狠的。其实用Windows自带的工具就能杀大部分进程:
c:>ntsd -c q -p PID
只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。ntsd从2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd自动就获得了debug权限,从而能杀掉大部分的进程。ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c参数从命令行传递就行了。Ntsd 按照惯例也向软件开发人员提供。只有系统开发人员使用此命令。用法:开个cmd.exe窗口,输入:
ntsd -c q -p PID
把最后那个PID,改成你要终止的进程的ID。如果你不知道进程的ID,任务管理器->进程选项卡->查看->选择列->勾上"PID(进程标识符)",然后就能看见了。
答2:xp下还有两个好东东tasklist和tskill。tasklist能列出所有的进程,和相应的信息。tskill能查杀进程,语法很简单:tskill 程序名!!
>>>>>>>>>>>>>>
Linux下DNS透明代理的实现
[ 2006/04/12 23:41 | by ipaddr ]
Linux下可以用Iptables加Dnsmasq做透明DNS代理。
DNS透明代理的作用,主要是控制某些域名的解析,比如,将www.ipadddr.com指向127.0.0.1。
基本思路是这样的,
用Linux做网关,并在网关在安装dnsmasq,启动dnsmasq,(也可以是其它的DNS代理服务器)
用Iptables将所有从网关通过的域名解析,转向dnsmasq
(一直漂原创,转载请注明。)
iptables -t nat -A PREROUTING -i eth0 -p upd --dport 53 -j REDIRECT --to-port 53
将所有内网网口(eth0)进入的DNS请求,都转向本机的53端口,这样,既使内网PC使了其它的DNS服务器,最终也是由网关解析。
透明代理实现后,可以实现修改内网的DNS解析的作用,主要有两种方法,一种是修改Linux下的/etc/hosts文件,加入IP和域名的对应,另一种是Dnsmasq本身支持静态DNS解析,可以通过配置文件或启动参数来配置DNS解析。
透明代理除了可以加快域名解析,还可以做访问控制,比如,禁止访问www.google.com,只需要网关上静态解析www.google.com到其它IP,比如(127.0.0.1)就行了。此外,通常MSN不好屏蔽,因为MSN的登录服务器比较多,而且,端口不固定,还有可能走80端口,但可以通过透明DNS来屏蔽,将用来登录的messager.hotmail.com,(还有一个,不记得了),解析到127.0.0.1,内网就无法登录MSN了。
以上在一成熟的UTM上测试通过。
>>>>>>>>>>>>>>>>>>>>>>
DNS透明代理的作用,主要是控制某些域名的解析,比如,将www.ipadddr.com指向127.0.0.1。
基本思路是这样的,
用Linux做网关,并在网关在安装dnsmasq,启动dnsmasq,(也可以是其它的DNS代理服务器)
用Iptables将所有从网关通过的域名解析,转向dnsmasq
(一直漂原创,转载请注明。)
iptables -t nat -A PREROUTING -i eth0 -p upd --dport 53 -j REDIRECT --to-port 53
将所有内网网口(eth0)进入的DNS请求,都转向本机的53端口,这样,既使内网PC使了其它的DNS服务器,最终也是由网关解析。
透明代理实现后,可以实现修改内网的DNS解析的作用,主要有两种方法,一种是修改Linux下的/etc/hosts文件,加入IP和域名的对应,另一种是Dnsmasq本身支持静态DNS解析,可以通过配置文件或启动参数来配置DNS解析。
透明代理除了可以加快域名解析,还可以做访问控制,比如,禁止访问www.google.com,只需要网关上静态解析www.google.com到其它IP,比如(127.0.0.1)就行了。此外,通常MSN不好屏蔽,因为MSN的登录服务器比较多,而且,端口不固定,还有可能走80端口,但可以通过透明DNS来屏蔽,将用来登录的messager.hotmail.com,(还有一个,不记得了),解析到127.0.0.1,内网就无法登录MSN了。
以上在一成熟的UTM上测试通过。
>>>>>>>>>>>>>>>>>>>>>>
SuidPerl的替换
[ 2006/04/12 23:34 | by ipaddr ]
默认情况下,用PERL写的CGI,是不可以调用某些系统管理命令的,比如iptables,近日开发一网关,要求Perl调用iptables实现网络配置,本来打算用SuidPerl实现Perl调用iptables的,但发现那网关系统上没有SuidPerl,而且不带编译器,无法编辑同版本的Suidperl。
最后想一办法,用C写程序,把C程序设成suid程序,把ipables命令做为这个C程序的参数调用,成功的解决了这一问题。
C程序大概如下:
#include <string.h>
...(ipaddr,admin.net(at)163.com)
int main(int argv,char * argc[])
{
.....
return (system(argc[1]));
}
gcc syscommand.c
chmod a+x syscommand
chmod a+s syscommand
chown root.root syscommand
mv syscommand /sbin/
Perl里面这样调用iptables:
system("/sbin/syscommand 'iptables -L'");
以上思路经测试成功,一直漂原创,转载请注明。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
最后想一办法,用C写程序,把C程序设成suid程序,把ipables命令做为这个C程序的参数调用,成功的解决了这一问题。
C程序大概如下:
#include <string.h>
...(ipaddr,admin.net(at)163.com)
int main(int argv,char * argc[])
{
.....
return (system(argc[1]));
}
gcc syscommand.c
chmod a+x syscommand
chmod a+s syscommand
chown root.root syscommand
mv syscommand /sbin/
Perl里面这样调用iptables:
system("/sbin/syscommand 'iptables -L'");
以上思路经测试成功,一直漂原创,转载请注明。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
常用CSS缩写语法总结
[ 2006/03/15 23:36 | by ipaddr ]
使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则如下:
颜色16进制的色彩值,如果每两位的值相同,可以缩写一半,例如:
#000000可以缩写为#000;#336699可以缩写为#369;
盒尺寸通常有下面四种书写方法:
property:value1; 表示所有边都是一个值value1;
property:value1 value2; 表示top和bottom的值是value1,right和left的值是value2
property:value1 value2 value3; 表示top的值是value1,right和left的值是value2,bottom的值是value3
property:value1 value2 value3 value4; 四个值依次表示top,right,bottom,left
方便的记忆方法是顺时针,上右下左。具体应用在margin和padding的例子如下:
margin:1em 0 2em 0.5em;
边框(border)边框的属性如下:
border-width:1px;
border-style:solid;
border-color:#000;
可以缩写为一句:border:1px solid #000;
语法是border:width style color;
背景(Backgrounds)背景的属性如下:
background-color:#f00;
background-image:url(background.gif);
background-repeat:no-repeat;
background-attachment:fixed;
background-position:0 0;
可以缩写为一句:background:#f00 url(background.gif) no-repeat fixed 0 0;
语法是background:color image repeat attachment position;
你可以省略其中一个或多个属性值,如果省略,该属性值将用浏览器默认值,默认值为:
color: transparent
image: none
repeat: repeat
attachment: scroll
position: 0% 0%
字体(fonts)字体的属性如下:
font-style:italic;
font-variant:small-caps;
font-weight:bold;
font-size:1em;
line-height:140%;
font-family:"Lucida Grande",sans-serif;
可以缩写为一句:font:italic small-caps bold 1em/140% "Lucida Grande",sans-serif;
注意,如果你缩写字体定义,至少要定义font-size和font-family两个值。
列表(lists)取消默认的圆点和序号可以这样写list-style:none;,
list的属性如下:
list-style-type:square;
list-style-position:inside;
list-style-image:url(image.gif);
可以缩写为一句:list-style:square inside url(image.gif);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
颜色16进制的色彩值,如果每两位的值相同,可以缩写一半,例如:
#000000可以缩写为#000;#336699可以缩写为#369;
盒尺寸通常有下面四种书写方法:
property:value1; 表示所有边都是一个值value1;
property:value1 value2; 表示top和bottom的值是value1,right和left的值是value2
property:value1 value2 value3; 表示top的值是value1,right和left的值是value2,bottom的值是value3
property:value1 value2 value3 value4; 四个值依次表示top,right,bottom,left
方便的记忆方法是顺时针,上右下左。具体应用在margin和padding的例子如下:
margin:1em 0 2em 0.5em;
边框(border)边框的属性如下:
border-width:1px;
border-style:solid;
border-color:#000;
可以缩写为一句:border:1px solid #000;
语法是border:width style color;
背景(Backgrounds)背景的属性如下:
background-color:#f00;
background-image:url(background.gif);
background-repeat:no-repeat;
background-attachment:fixed;
background-position:0 0;
可以缩写为一句:background:#f00 url(background.gif) no-repeat fixed 0 0;
语法是background:color image repeat attachment position;
你可以省略其中一个或多个属性值,如果省略,该属性值将用浏览器默认值,默认值为:
color: transparent
image: none
repeat: repeat
attachment: scroll
position: 0% 0%
字体(fonts)字体的属性如下:
font-style:italic;
font-variant:small-caps;
font-weight:bold;
font-size:1em;
line-height:140%;
font-family:"Lucida Grande",sans-serif;
可以缩写为一句:font:italic small-caps bold 1em/140% "Lucida Grande",sans-serif;
注意,如果你缩写字体定义,至少要定义font-size和font-family两个值。
列表(lists)取消默认的圆点和序号可以这样写list-style:none;,
list的属性如下:
list-style-type:square;
list-style-position:inside;
list-style-image:url(image.gif);
可以缩写为一句:list-style:square inside url(image.gif);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PHP+GD安装补充
[ 2006/03/02 23:37 | by ipaddr ]
PHP+GD安装补充
之前,我曾写过PHP+GD库的安装,当时,font-config,freetype,libjpeg,libpng等库都是使用RPM包方式安装上去的,此方式安装,一般不会出问题。
但在使用真彩色的图片时,imagettftext函数就会出现错误,表现为颜色失真,字体和形状失真。
之所以引起这样的错误,主要是RedHat自带的freetype库有问题。解决的办法是:
1.先把freetype删除
rpm -e freetype --nodeps
rpm -e freetype-devel --nodeps
2.再源代码安装最新的Freetype
Freetype官方网站:http://www.freetype.org
上官方网站下载最新的freetype2.1.10
tar zxvf freetype-2.1.10.tgz
cd freetype-2.1.10
./configure
make
make install
3.安装好Freetype后,再安装PHP,此时需要注意,一定要加上以下几个参数:
--with-ttf
--with-freetype
--with-freetype-dir=/usr/local
完整的参数列表,可参考:
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-gd --with-zlib --with-png --with-ttf --with-jpeg --with-freetype --with-freetype-dir=/usr/local --with-xpm --with-iconv --enable-exif --enable-sockets --enable-ftp --enable-mbstring --enable-gd-native-ttf
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
之前,我曾写过PHP+GD库的安装,当时,font-config,freetype,libjpeg,libpng等库都是使用RPM包方式安装上去的,此方式安装,一般不会出问题。
但在使用真彩色的图片时,imagettftext函数就会出现错误,表现为颜色失真,字体和形状失真。
之所以引起这样的错误,主要是RedHat自带的freetype库有问题。解决的办法是:
1.先把freetype删除
rpm -e freetype --nodeps
rpm -e freetype-devel --nodeps
2.再源代码安装最新的Freetype
Freetype官方网站:http://www.freetype.org
上官方网站下载最新的freetype2.1.10
tar zxvf freetype-2.1.10.tgz
cd freetype-2.1.10
./configure
make
make install
3.安装好Freetype后,再安装PHP,此时需要注意,一定要加上以下几个参数:
--with-ttf
--with-freetype
--with-freetype-dir=/usr/local
完整的参数列表,可参考:
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-gd --with-zlib --with-png --with-ttf --with-jpeg --with-freetype --with-freetype-dir=/usr/local --with-xpm --with-iconv --enable-exif --enable-sockets --enable-ftp --enable-mbstring --enable-gd-native-ttf
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
浅析字符集以及PHP+Mysql4.1的乱码问题
[ 2006/03/02 23:27 | by ipaddr ]
一.原理篇
Mysql的字符集里有两个概念,一个是“Character set(字符集)”,另一个是“Collations”。
1. Collations
Collations翻成中文是“校验”,在网页开发的过程中,这个词汇,只在Mysql里使用,主要作用是指导Mysql对字符的比较,比如,ASCII字符集里,Collations规定了a小于b,a等于a,以及a是否等于A之类的。通常,大家基本可以忽略Collations的存在,因为每个字符集都有一个默认的Collations,通常,使用默认的Collations就可以了。
2.字符集
与这对比的是,字符集是个更广的概念,即使是Windows下普通的文本文件,也渗及到字符集的问题。不同的字符集,规定了不同的字符的编码方式。一个character set (字符集)是一组符号和编码,比如,ASCII字符集,包括的字符有:数字,大小写字母,分号、换行之类的符号,编码方式是用一个7bit表示一个字符(A的编码是65,b的编码是98)。ASCII只规定了英文字母的编码,非英文语言不能用ASCII编码表示,为此,不同的国家,都为自己的语言做了编码,比如,我们国家,就有GB2312编码。但每个国家之间的编码不同,也存在着一些跨平台的问题,为此,一些国际化标准组织,就制定了一些国际通用的编码,最常用的就是UTF8了。ASCII只对英文符号和英文字母做了编码,GB2312对英文符号,英文字母,汉字做了编码,UTF8对世界上所有的语言文字做了编码,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。由此可见,UTF8是所含最广字符的字符集,所以,在一些多语言的WEB系统中,一般用UTF8字符集(PHPMyAdmin使用UTF8编码)。
任何文本的存储,都渗及到字符集的概念。包括数据库,也包括普通的文本文件。
主要术语:
字符:汉字,英文字母,标点符号,拉丁文等等。
编码:将字符转换成计算机存储的格式,比如,A用65表示。
字符集:一组字符以及对应的编码方式。
a. Mysql的字符集
Mysql目前支持多字符集,并且,支持在不同的字符集之间转换(便于移植和支持多语言)。
Mysql可以设置服务器级字符集、数据库级字符集、数据表级字符集、表列的字符集,实际上,最终使用字符集的地方是存储字符的列,比如,你设置table1中col1列是字符类型,col1才用到了字符集,如果table1表的col2列是int类型,col2不使用字符集的概念。
服务器级字符集、数据库级字符集、数据表级字符集都是为列的字符集做默认选项的。
Mysql一定有一个字符集,可以通过启动时加参数指定 ,也可以编译时指定,也可以在配置文件里指定。Mysql服务器字符集,只是做为数据库级的默认值。创建数据库时,你可以指定字符集,如果没指定,就使用服务器的字符集。同理,创建表时,你可以指定表级的字符集,如果没指定,使用数据库的字符集做为表的字符集。创建列时,你可以指定某列的字符集,如果没指定,就使用表的字符集。
通常情况下,您只需设置服务器级的字符集,其它的数据库级,表级,以及列级的字符集,都继承自服务器级字符集。
由于UTF8是最广的字符集,所以,一般情况下,我们设置Mysql服务器级的字符集为UTF8!
b. 普通文本的字符集问题
任何文本的存储,都存在着字符集的问题,普通文本文件也不例外。
Windows2000+的系统中,打开记事本,“保存为…”对话框,就有一个选项,可以让你选择存储文本的编码方式。
通常情况下,大家都使用Windows2000+的系统,都使用默认的编码,所以,不会碰到字符集的问题。
Windows下,保存文本文件时,可以选择编码方式,但打开文本文件时,都是自动判断编码方式的。网上有一个用Windows2000+的记事本玩移动,联通的笑话,大家可以搜搜,就是因为Windows在打开文本文件时,编码判断错误引起的问题。
因为自动判断编码有时会错误,所以,有的文本文件,规定了如何识别自身所使用的编码。HTML文件就是一个这样的例子。
HTML是文本文件。存储HTML文件的时候,需要使用一个编码,并且,在HTML文件里,也使用HTML语法,指定了该文件所使用的编码(比如<meta http-equiv="content-type" content="text/html; charset=UTF-8">)。如果HTML文件没有指定编码,则浏览器自动识别文件的编码。如果HTML指定了编码,则浏览器使用HTML指定的编码。
通常情况下,HTML文件指定的charset和HTML文件自身的编码是一致的,但也有不一致的情况,如果不一致,就会导致网页乱码(此处乱码,只和文本文件有关,和数据库无关。)使用专门的网页编辑工具(比如Dreamwave),会自动根据网页中的charset值来编码文件。
c. php+mysql的字符集问题
PHP最终生成的是文本文件,但他要取数据库里的文本,或将文本存进数据库。
由于Mysql支持多字符集,默认情况下,Mysql不知道PHP发给他的是什么编码的字符,所以,Mysql要求客户端(PHP)告诉他存取的字符集是什么。
PHP通过设置character_set_client,告诉Mysql,PHP存进数据库的是什么编码方式。
PHP通过设置character_set_results,告诉Mysql,PHP需要取什么样编码的数据。
PHP通过设置character_set_connection,告诉Mysql,PHP查询中的文本,使用什么编码。
MYSQL使用设置的编码方式存储文本。
假设Mysql使用setserver来存储文本,PHP的character_set_client是setclient,PHP的character_set_results是setresult。那么,Mysql将PHP发来的文本,从setclient编码方式,转换成setserver编码方式,再存入数据库,如果PHP取文本,Mysql将文本从setserver转换成setresult,再发送给PHP。
PHP文件(最终生成的HTML文件)本身有个编码,如果Mysql传过来的编码,与PHP文件自身的编码不同,那么,整个网页,必然乱码。所以,PHP一般将自己的编码方式,告诉Mysql。
要保证不乱码,就必须将三个编码统一:一是网页自身的编码,二是HTML里指定的编码,三是PHP告诉Mysql的编码(包括character_set_client和character_set_results)。
第一和第二个编码,如果使用DW之类的编辑器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。
第三个编码,需要手工通知Mysql。这步可以通过在PHP里使用mysql_query(“set names characterX”)来实现。
d.字符集的转换问题
如果小字集转换成大字符集,不会丢失数据,但大字集,转换成小字集,可能会丢失数据。
比如,UTF8里有的字符,GB2312不一定有,所以,从UTF8转换到GB2312可能会丢失一些字符。
但有种情况例外,先从GB2312转成UTF8,再从UTF8转成GB2312,这种情况是不会丢数据的,因为,刚开始转换的文本,都是GB2312里的字符,所以,整个过程都是GB2312的字符在转换,不会丢失。
正因为UTF8能容纳世界上的所有字符,所以,数据库一般使用UTF8编码。这使得,任何字符都可以存进UTF8编码的数据库。
e. PHPMyAdmin乱码的问题
PHPMyAdmin支持多国语言,这就必定要求HTML页面使用UTF8编码。
HTML页面使用UTF8编码,这就必定要求PHPMyAdmin连接Mysql时,character_set_client和character_set_results使用UTF8编码。
当前情况下,PHP连接Mysql只能是使用set names(或其它几个语句)来通知Mysql的编码方式,如果没有显式的声明编码方式,都将使用latin1编码。一般的程序,都没有显式声明character_set_client变量,所以,都是将gb2312文本,按latin1编码方式存在数据库,PHPMyAdmin再用utf8格式读取,肯定是乱码的。
如果PHP程序按正确的编码存入数据库,肯定是没有问题的。所以,需要修改的不是PHPMyAdmin.(虽然有时修改PHPMyAdmin可以解决乱码问题,但这不是问题的根本)
二.总结篇
上面的讲得有点乱,总结一下:
1. 数据库尽量使用utf8存储(修改/etc/my.cnf,在[mysqld]段加上default-character-set=utf8)
(已有的数据库,先转成UTF8格式)
2. PHP程序在查询数据库之前,执行mysql_query(“set names xxxx”);其中xxxx是你网页的编码(charset=xxxx),如果网页中charset=utf8,则xxxx=utf8,如果网页中charset=gb2312,则xxxx=gb2312,如果网页中的charset=ipaddr,则xxxx=ipaddr (开个玩笑,没这编码)
几乎所有WEB程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入mysql_query(“set names”)就可以了。
3. PHPMyAdmin不需要做改动。
4. 需要注意的是,为保证网页实际编码(Windows保存对话框里的编码)和他声明的编码(charset=?)是一致的,请用DW之类的工具做网页。
写得有点仓促,希望大家指正和补充。
补充:
服务器级的字符集指定方法:a./etc/my.cnf配置文件指定b.启动mysqld时,带参数指定c. 编译Mysql时,内定了一个默认字符集。
数据库级字符集的获取方法:创建数据库时,指定默认字符集,如果没有指定,就使用服务器字符集。此外,数据库字符集,存放在数据库目录下,一般的,在Linux下为/var/lib/Mysql/dbname/db.opt文件,此文件为dbname数据库的字符集配置文件,属于文本文件,只有一行。所以,整个数据库目录(/var/lib/Mysql/dbname/拷贝到其它服务器上时,数据库的字符集也将移动。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Mysql的字符集里有两个概念,一个是“Character set(字符集)”,另一个是“Collations”。
1. Collations
Collations翻成中文是“校验”,在网页开发的过程中,这个词汇,只在Mysql里使用,主要作用是指导Mysql对字符的比较,比如,ASCII字符集里,Collations规定了a小于b,a等于a,以及a是否等于A之类的。通常,大家基本可以忽略Collations的存在,因为每个字符集都有一个默认的Collations,通常,使用默认的Collations就可以了。
2.字符集
与这对比的是,字符集是个更广的概念,即使是Windows下普通的文本文件,也渗及到字符集的问题。不同的字符集,规定了不同的字符的编码方式。一个character set (字符集)是一组符号和编码,比如,ASCII字符集,包括的字符有:数字,大小写字母,分号、换行之类的符号,编码方式是用一个7bit表示一个字符(A的编码是65,b的编码是98)。ASCII只规定了英文字母的编码,非英文语言不能用ASCII编码表示,为此,不同的国家,都为自己的语言做了编码,比如,我们国家,就有GB2312编码。但每个国家之间的编码不同,也存在着一些跨平台的问题,为此,一些国际化标准组织,就制定了一些国际通用的编码,最常用的就是UTF8了。ASCII只对英文符号和英文字母做了编码,GB2312对英文符号,英文字母,汉字做了编码,UTF8对世界上所有的语言文字做了编码,所以,GB1212的字符包含了ASCII字符,UTF8包含了GB2312字符。由此可见,UTF8是所含最广字符的字符集,所以,在一些多语言的WEB系统中,一般用UTF8字符集(PHPMyAdmin使用UTF8编码)。
任何文本的存储,都渗及到字符集的概念。包括数据库,也包括普通的文本文件。
主要术语:
字符:汉字,英文字母,标点符号,拉丁文等等。
编码:将字符转换成计算机存储的格式,比如,A用65表示。
字符集:一组字符以及对应的编码方式。
a. Mysql的字符集
Mysql目前支持多字符集,并且,支持在不同的字符集之间转换(便于移植和支持多语言)。
Mysql可以设置服务器级字符集、数据库级字符集、数据表级字符集、表列的字符集,实际上,最终使用字符集的地方是存储字符的列,比如,你设置table1中col1列是字符类型,col1才用到了字符集,如果table1表的col2列是int类型,col2不使用字符集的概念。
服务器级字符集、数据库级字符集、数据表级字符集都是为列的字符集做默认选项的。
Mysql一定有一个字符集,可以通过启动时加参数指定 ,也可以编译时指定,也可以在配置文件里指定。Mysql服务器字符集,只是做为数据库级的默认值。创建数据库时,你可以指定字符集,如果没指定,就使用服务器的字符集。同理,创建表时,你可以指定表级的字符集,如果没指定,使用数据库的字符集做为表的字符集。创建列时,你可以指定某列的字符集,如果没指定,就使用表的字符集。
通常情况下,您只需设置服务器级的字符集,其它的数据库级,表级,以及列级的字符集,都继承自服务器级字符集。
由于UTF8是最广的字符集,所以,一般情况下,我们设置Mysql服务器级的字符集为UTF8!
b. 普通文本的字符集问题
任何文本的存储,都存在着字符集的问题,普通文本文件也不例外。
Windows2000+的系统中,打开记事本,“保存为…”对话框,就有一个选项,可以让你选择存储文本的编码方式。
通常情况下,大家都使用Windows2000+的系统,都使用默认的编码,所以,不会碰到字符集的问题。
Windows下,保存文本文件时,可以选择编码方式,但打开文本文件时,都是自动判断编码方式的。网上有一个用Windows2000+的记事本玩移动,联通的笑话,大家可以搜搜,就是因为Windows在打开文本文件时,编码判断错误引起的问题。
因为自动判断编码有时会错误,所以,有的文本文件,规定了如何识别自身所使用的编码。HTML文件就是一个这样的例子。
HTML是文本文件。存储HTML文件的时候,需要使用一个编码,并且,在HTML文件里,也使用HTML语法,指定了该文件所使用的编码(比如<meta http-equiv="content-type" content="text/html; charset=UTF-8">)。如果HTML文件没有指定编码,则浏览器自动识别文件的编码。如果HTML指定了编码,则浏览器使用HTML指定的编码。
通常情况下,HTML文件指定的charset和HTML文件自身的编码是一致的,但也有不一致的情况,如果不一致,就会导致网页乱码(此处乱码,只和文本文件有关,和数据库无关。)使用专门的网页编辑工具(比如Dreamwave),会自动根据网页中的charset值来编码文件。
c. php+mysql的字符集问题
PHP最终生成的是文本文件,但他要取数据库里的文本,或将文本存进数据库。
由于Mysql支持多字符集,默认情况下,Mysql不知道PHP发给他的是什么编码的字符,所以,Mysql要求客户端(PHP)告诉他存取的字符集是什么。
PHP通过设置character_set_client,告诉Mysql,PHP存进数据库的是什么编码方式。
PHP通过设置character_set_results,告诉Mysql,PHP需要取什么样编码的数据。
PHP通过设置character_set_connection,告诉Mysql,PHP查询中的文本,使用什么编码。
MYSQL使用设置的编码方式存储文本。
假设Mysql使用setserver来存储文本,PHP的character_set_client是setclient,PHP的character_set_results是setresult。那么,Mysql将PHP发来的文本,从setclient编码方式,转换成setserver编码方式,再存入数据库,如果PHP取文本,Mysql将文本从setserver转换成setresult,再发送给PHP。
PHP文件(最终生成的HTML文件)本身有个编码,如果Mysql传过来的编码,与PHP文件自身的编码不同,那么,整个网页,必然乱码。所以,PHP一般将自己的编码方式,告诉Mysql。
要保证不乱码,就必须将三个编码统一:一是网页自身的编码,二是HTML里指定的编码,三是PHP告诉Mysql的编码(包括character_set_client和character_set_results)。
第一和第二个编码,如果使用DW之类的编辑器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。
第三个编码,需要手工通知Mysql。这步可以通过在PHP里使用mysql_query(“set names characterX”)来实现。
d.字符集的转换问题
如果小字集转换成大字符集,不会丢失数据,但大字集,转换成小字集,可能会丢失数据。
比如,UTF8里有的字符,GB2312不一定有,所以,从UTF8转换到GB2312可能会丢失一些字符。
但有种情况例外,先从GB2312转成UTF8,再从UTF8转成GB2312,这种情况是不会丢数据的,因为,刚开始转换的文本,都是GB2312里的字符,所以,整个过程都是GB2312的字符在转换,不会丢失。
正因为UTF8能容纳世界上的所有字符,所以,数据库一般使用UTF8编码。这使得,任何字符都可以存进UTF8编码的数据库。
e. PHPMyAdmin乱码的问题
PHPMyAdmin支持多国语言,这就必定要求HTML页面使用UTF8编码。
HTML页面使用UTF8编码,这就必定要求PHPMyAdmin连接Mysql时,character_set_client和character_set_results使用UTF8编码。
当前情况下,PHP连接Mysql只能是使用set names(或其它几个语句)来通知Mysql的编码方式,如果没有显式的声明编码方式,都将使用latin1编码。一般的程序,都没有显式声明character_set_client变量,所以,都是将gb2312文本,按latin1编码方式存在数据库,PHPMyAdmin再用utf8格式读取,肯定是乱码的。
如果PHP程序按正确的编码存入数据库,肯定是没有问题的。所以,需要修改的不是PHPMyAdmin.(虽然有时修改PHPMyAdmin可以解决乱码问题,但这不是问题的根本)
二.总结篇
上面的讲得有点乱,总结一下:
1. 数据库尽量使用utf8存储(修改/etc/my.cnf,在[mysqld]段加上default-character-set=utf8)
(已有的数据库,先转成UTF8格式)
2. PHP程序在查询数据库之前,执行mysql_query(“set names xxxx”);其中xxxx是你网页的编码(charset=xxxx),如果网页中charset=utf8,则xxxx=utf8,如果网页中charset=gb2312,则xxxx=gb2312,如果网页中的charset=ipaddr,则xxxx=ipaddr (开个玩笑,没这编码)
几乎所有WEB程序,都有一段连接数据库的公共代码,放在一个文件里,在这文件里,加入mysql_query(“set names”)就可以了。
3. PHPMyAdmin不需要做改动。
4. 需要注意的是,为保证网页实际编码(Windows保存对话框里的编码)和他声明的编码(charset=?)是一致的,请用DW之类的工具做网页。
写得有点仓促,希望大家指正和补充。
补充:
服务器级的字符集指定方法:a./etc/my.cnf配置文件指定b.启动mysqld时,带参数指定c. 编译Mysql时,内定了一个默认字符集。
数据库级字符集的获取方法:创建数据库时,指定默认字符集,如果没有指定,就使用服务器字符集。此外,数据库字符集,存放在数据库目录下,一般的,在Linux下为/var/lib/Mysql/dbname/db.opt文件,此文件为dbname数据库的字符集配置文件,属于文本文件,只有一行。所以,整个数据库目录(/var/lib/Mysql/dbname/拷贝到其它服务器上时,数据库的字符集也将移动。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>