php使用iconv进行从utf-8转为gb2312字符编码出错解决方案

[1601004注]这篇文章没啥价值,请读者参考php官方手册吧,官方有中译本

在php函数库有一个函数:iconv()

把gb2312置换成utf-8

$text=iconv("GB2312","UTF-8",$text);

在用$text=iconv("UTF-8","GB2312",$text)过程中,如果遇到一些特别字符时,如:"—",英文名中的"."等等字符,转换就断掉了。这些字符后的文字都没法继续转换了。

针对这的问题,可以用如下代码实现

$text=iconv("UTF-8","GBK",$text);

你没有看错,就这么简单,不使用gb2312,而写成GBK,就可以了。

还有一种方法:

第二个参数,加上//IGNORE,忽略错误,如下:

iconv("UTF-8","GB2312//IGNORE",$data);

没有具体比较这两种方法,感觉第一种(GBK代替gb2312)方法更好.

php手册中iconv() 说明

iconv

(PHP 4 >= 4.0.5, PHP 5)

iconv -- Convert string to requested character encoding

Description

string iconv ( string in_charset, string out_charset, string str )

Performs a character set conversion on the string str from in_charset to out_charset. Returns the converted string or FALSE on failure.

If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can't be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character.

例子 1. iconv() example:

<?php
echo iconv("ISO-8859-1", "UTF-8", "This is a test.");
?>

string iconv ( string $in_charset , string $out_charset , string $str )

在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。

此时可以使用以下方法解决:

//author:zhxia
$str=iconv('utf-8',"gb2312//TRANSLIT",file_get_contents($filepath));

即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。

此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。

php程序中的编码转换

在php中解决字符编码转换,可以编写自定义的php函数进行字符编码解码,但是对性能有一定影响,并且要针对每种字符编码编写专用的函数; 这里介绍在php中有简便易用的专用函数:

1.使用iconv函数转换字符编码,该函数仅能在PHP4.0.5以上版本或PHP5.x版本使用,具体用法如下:

$string=iconv(原字符编码, 字符输出编码, $string);

例如:网页使用gbk编码,字符串使用utf-8编码,将字符转换为网页显示编码。

echo iconv("uft-8", "gbk", "php编码转换");

在实际使用中,iconv函数在转换时存在一点小bug,在转换字符串中含有"—"时会出错,导致字符串无法转换,使用//IGNORE参数可以忽略转换中的字符错误,样例如下:

echo iconv("uft-8", "gbk//IGNORE", "php编码转换");

2.使用mb_convert_encoding函数,该函数仅能在PHP4.0.6以上版本或PHP5.x版本使用,使用之前必须enable mbstring,具体用法如下:

$string=mb_convert_encoding($string, 字符输出编码, 原字符编码);

例如:网页使用gbk编码,字符串使用utf-8编码,将字符转换为网页显示编码。

echo mb_convert_encoding("php编码转换", "gbk", "utf-8");

windows下mbstring安装配置请参看这里 windows下PHP 激活mbstring扩展及php.ini中相关基本设置

总结:推荐使用mb_convert_encoding函数,该函数无iconv转换字符错误问题。

Bypassing script filters with variable-width encodings

Author: Cheng Peng Su (applesoup_at_gmail.com)
Date: August 7, 2006

We've all known that the main problem of constructing XSS attacks is
how to obfuscate malicious code. In the following paragraphs I will

attempt to explain the concept of bypassing script filters with
variable-width encodings, and disclose the applications of this
concept to

Hotmail and Yahoo! Mail web-based mail services.

Variable-width encoding Introduction
====================================

A variable-width encoding(a.k.a variable-length encoding) is a type of
character encoding scheme in which codes of differing lengths are

used to encode a character set. Most common variable-width encodings
are multibyte encodings, which use varying numbers of bytes to encode

different characters. The first use of multibyte encodings was for the
encoding of Chinese, Japanese and Korean, which have large character

sets well in excess of 256 characters. The Unicode standard has two
variable-width encodings: UTF-8 and UTF-16. The most commonly-used

codes are two-byte codes. The EUC-CN form of GB2312, plus EUC-JP and
EUC-KR, are examples of such two-byte EUC codes. And there are also

some three-byte and four-byte codes.

Example and Discussion
======================

The following is a php file from which I will start to introduce my idea.

------------------------------example.php--------------------------------

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?

for($i=0;$i<256;$i++){
echo "Char $i is <font face=\"xyz".chr($i)."\">not </font>"
."<font face=\" onmouseover=alert($i) notexist=".chr($i)."\"     >"
// NOTE: 5 space characters following the last \"
."available</font>\r\n\r\n<br>\r\n\r\n";
}

?>
</body>
</html>

-------------------------------------------------------------------------

For most values of $i, Internet Explorer 6.0(SP2) will display "Char
XXX is not available". When $i is between 192(0xC0) and 255(0xFF), you

can see "Char XXX is available". Let's take $i=0xC0 for example,
consider the following code:

Char 192 is <font face="xyz[0xC0]">not </font><font face="
onmouseover=alert(192) s=[0xC0]"     >available</font>

0xC0 is one of the 32 first bytes of 2-byte sequences (0xC0-0xDF) in
UTF-8. So when IE parses the above code, it will consider 0xC0 and the

following quote as a sequence, and therefore these two pairs of FONT
elements will become one with "xyz[0xC0]">not </font><font face=" as

the value of FACE parameter. The second 0xC0 will start another 2-byte
sequence as a value of NOTEXIST parameter which is not quoted. Due

to a space character following by the quote, 0xE0-0xEF which are first
bytes of 3-byte sequences, together with the following quote and one

space character will be considered as the value of NOTEXIST parameter.
And each of the first bytes of 4-byte sequences(0xF0-0xF7), 5-byte

sequences(0xF8-0xFB), 6-byte sequences(0xFC-0xFD), together with the
following quote and space characters will be considered as one

sequence.

Here are the results of the above code parsed by Internet Explorer
6.0(SP2), Firefox 1.5.0.6 and Opera 9.0.1 in different variable-width

encodings respectively. Note that the numbers in the table are the
ranges of "available" characters.

+-----------+-----------+-----------+-----------+
|           | IE        | FF        | OP        |
+-----------+-----------+-----------+-----------+
| UTF-8     | 0xC0-0xFF | none      | none      |
+-----------+-----------+-----------+-----------+
| GB2312    | 0x81-0xFE | none      | 0x81-0xFE |
+-----------+-----------+-----------+-----------+
| GB18030   | none      | none      | 0x81-0xFE |
+-----------+-----------+-----------+-----------+
| BIG5      | 0x81-0xFE | none      | 0x81-0xFE |
+-----------+-----------+-----------+-----------+
| EUC-KR    | 0x81-0xFE | none      | 0x81-0xFE |
+-----------+-----------+-----------+-----------+
| EUC-JP    | 0x81-0x8D | 0x8F      | 0x8E      |
|           | 0x8F-0x9F |           | 0x8F      |
|           | 0xA1-0xFE |           | 0xA1-0xFE |
+-----------+-----------+-----------+-----------+
| SHIFT_JIS | 0x81-0x9F | 0x81-0x9F | 0x81-0x9F |
|           | 0xE0-0xFC | 0xE0-0xFC | 0xE0-0xFC |
+-----------+-----------+-----------+-----------+

Application
===========

I don't think there is a typical exploitation of bypassing script
filters with variable-width encodings, because the exploitation is
very

flexible. But you just need to remember that if the webapp use
variable-width encodings, you can bury some characters following by
your

entry, and the buried characters might be very crucial.

The above code might be exploited in general webapps which allow you
to add formatting to your entry in the same way as HTML does. For

example, in some forums, [font=Courier New]message[/font] in your
message will be transformed into <font face="Courier
New">message</font>.

Supposing it use UTF-8, we can attack by sending

[font=xyz[0xC0]]buried[/font][font=abc onmouseover=alert()
s=[0xC0]]exploited[/font]

And it will be tranformed into

<font face="xyz[0xC0]">buried</font><font face="abc
onmouseover=alert() s=[0xC0]">exploited</font>

Again, the exploitation is very flexible, this FONT-FONT example is
just an enlightening one. The following exploitaion to Yahoo! Mail is

quite different from this one.

Disclosure
==========

Using this method, I have found two XSS vulnerabilities in Hotmail and
Yahoo! Mail web-based mail services. I informed Yahoo and Microsoft

on April 30 and May 12 respectively. And they have patched the vulnerabilities.

Yahoo! Mail XSS
---------------

Before I discovered this vulnerability, Yahoo! Mail filtering engine
could block "expression()" syntax in a CSS attribute using a comment

to break up expression( expr/* */ession() ). I used [0x81] with the
following asterisk to make a sequence, so that the second */ would

close the comment. But the filtering engine considered the first two
comment symbol as a pair.

--------------------------------------------------------------------
MIME-Version: 1.0
From: user<user@site.com>
Content-Type: text/html; charset=GB2312
Subject: example

<span style='width:expr/*[0x81]*/*/ession(alert())'>exploited</span>
.
--------------------------------------------------------------------

Hotmail XSS
-----------

This exploitation is almost the same as the example.php.

--------------------------------------------------------------------
MIME-Version: 1.0
From: user<user@site.com>
Content-Type: text/html; charset=SHIFT_JIS
Subject: example

<font face="[0x81]"></font><font face=" onmouseover=alert()
s=[0x81]">exploited</font>
.
--------------------------------------------------------------------

Reference
=========

Wikipedia:Variable-width
encoding(http://en.wikipedia.org/wiki/Variable-width_encoding)
RFC 3629, the UTF-8 standard(http://tools.ietf.org/html/rfc3629)
RSnake:XSS Cheat Sheet(http://ha.ckers.org/xss.html)

( Original text: http://applesoup.googlepages.com/bypass_filter.txt )

php获取客户端IP地址方法大汇总

php获取客户端IP地址方法方法1

PHP Code one:

<?
$iipp
=$_SERVER["REMOTE_ADDR"];
echo
$iipp;
?>

 

php获取客户端IP地址方法方法2

PHP Code two:

<?php
$user_IP
= ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];echo$user_IP;
?>

///////////////////////////////////////////////<?
function get_real_ip(){
$ip=false;
if(!empty(
$_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if (
$ip) { array(促销产品 主营产品)_unshift($ips, $ip); $ip = FALSE; }
for (
$i = 0; $i < count($ips); $i++) {
if (!
eregi ("^(10|172\.16|192\.168)\.", $ips[$i])) {
$ip = $ips[$i];
break;
}
}
}
return (
$ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
echo get_real_ip();
?>
php获取客户端IP地址方法方法3
PHP Code three:
<?
//php获取ip的算法
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
{
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif (
$HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
{
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif (
$HTTP_SERVER_VARS["REMOTE_ADDR"])
{
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (
getenv("HTTP_X_FORWARDED_FOR"))
{
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (
getenv("HTTP_CLIENT_IP"))
{
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (
getenv("REMOTE_ADDR"))
{
$ip = getenv("REMOTE_ADDR");
}
else
{
$ip = "Unknown";
}
echo
"你的IP:".$ip ;
?>
php获取客户端IP地址方法方法4
PHP Code four:
<?
if(getenv('HTTP_CLIENT_IP')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(
getenv('HTTP_X_FORWARDED_FOR')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(
getenv('REMOTE_ADDR')) {
$onlineip = getenv('REMOTE_ADDR');
} else {
$onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
echo
$onlineip;
?>

kingston U盘量产失败修复方法及工具

随便搞U盘量产,进行到半途中,进度条老长时间都没有动,一把拔下U盘,再插上后,突然发现电脑不认了,在右下角里的系统托盘里有显示,mash storage device,但资源管理器里没有,windows磁盘管理里也没有。看来是量产坏掉了,修复吧。

首选使用量产恢复工具,但没有找到,几个月前用sandisk的u盘量产并恢复过,很成功。但之前sandisk的工具肯定是用不上的,因为不是一家的主控芯片。网上查资料,有人说拆开把芯片的“引角短路”的方法修复(http://www.mydigit.net/read.php?tid=53927&page=1  点这里打开),正如文中所说,这拆后U盘就不能质保了,今天中午才买的,实在有点不甘心。尝试拆天,但好像确实比较难,用小刀撬了几下,没有撬开,太使劲不能保证外壳完整了,于是住手。

要找其它的工具,拆机是最后的方案,现在不考虑(至少还有这样方案:去买U盘的店里,说“u盘突然不识别了”,让老板想办法,反正也有5年保固服务的)。低格工具,Phison_UP10_lformat_v1.30,下载了好几个版本都不能用,提示“Preformat does not support this IC!”

不过还好,最后终于找到了一个可以用的,用自己的劳动救“活”了U盘。放到这里,以备日后使用、及有缘人使用。kingston金士顿DataTraveler8g U盘量产失败修复工具(下载该修复工具)

另附量产相关工具,好几个版本,全放这里好了。

ChipGenius/U盘芯片检测工具

kingstone 8g U盘量产工具(多个版本)

IE9 preview试用,很垃圾,很失望

或许毕竟还只是preview版本的原因,也或许是IE实在垃圾的原因,试用了一个ie9 preview4版本,当然是m$官方下载了,google搜索ie9,第一条就是,下载,用上网本的windows7下的firefox下载,速度不快,开始50K,半分钟就隆到10K以下了,于是在frdora下使用jigsaw下载,速度平均在40K左右的样子,2M的带宽,下载只有这么40K,可能是ms他们的下载服务器没搞好,或者考虑到只是下预览版,没有考虑大量下载负荷的问题。拷到上网本的win7下,安装,照例是傻瓜安装,也照例是安装微软程序习惯的“重启”电电脑。重启吧,是多系统,win7只是其中一个,不是默认进入,还要选择。启动过程中,又出现“windows update正在配置”的提示,还要下载3个更新包,应该并不大,几分钟完成了,进入windows画面。桌面上多出来傻傻的IE图标,点击进去,果然跟网上别人发的图片一样,没有地址栏,要从菜单里打开一个输入地址的小对话框。菜单也简陋得不成样子,但里面第二个菜单项就是debug,看来微软意识到他自己浏览器的问题了,要附带上一下调试工具,不然,鬼才能搞懂那变态的、诡异的css支持。没有仔细看是否调试里有IE5,7,8几个版本的兼容选项,就是没有IE6。打开google首页随便搜索个关键词,机器猫css,想看看IE9preview对css的支持如何,是否真的如网上的篇文章里说的、连google都有称赞它的地方。然而结果列表链接去好像无法打开,试几次都不知,于是直接关掉,然后卸载ie9,实在比较垃圾,这个ie9.虽然maxthon等浏览器也基于ie的内核,但加入了很多实用的功能,可ie,却像头老病牛一样,一点一点的挪动着,缓缓的,比散步都慢,堪称牛步。

一个查询网站基本信息的工具网站,可以查询服务器位置,Web服务器程序,主要程序语言,排名,IP地址等信息 domwiki.org

http://zh.domwiki.org/
一个查询网站基本信息的工具网站,可以查询以下信息:服务器位置,Web服务器程序,主要程序语言,排名,IP地址等信息,zh子域名是其中文版,好像是很机械的翻译出来的,虽然有些地方不准确,但可以理解得通。

http://zh.domwiki.org/path8.net

这是使用它自己查询它自己域名的信息:
Domwiki.org是4390:th .ORG内最大的网站。
该网站推出的Wednesday, August 25, 2010。 该服务器主机domwiki.org在Plano, United States位置。 主要语言用于网站的文字内容是中文。 该服务器位于Layered Technologies, Inc 网络。

Ltdomains似乎是由Domwiki.使用托管服务提供商

wine个人目录下菜单项Programs位置/wine菜单项腾讯软件QQ2010删除卸载

fodora13,gnome桌面,只因为无聊测试之用,运行QQ2010的安装程序,安装向导基本正常运行运行,但无法正常使用,所以卸载,但运行卸载后,主菜单里还有wine菜单项,里有Programs子菜单,里面还有“腾讯软件-QQ2010”,再运行里里面的卸载,还是一样,这个菜单项并不能自动删除。

于是自己找一样,这个菜单项具体在哪个目录里的哪个文件。

新建一个账号,登录后,主菜单里没有wine一项,所以基本上可以认定,这个菜单项在用户目录里。

锁定在用户家目录里找,这种配置型的文件一般都会在隐藏目录里,那就在家目录里运行 ls -a , 里面有.local目录,终于在这个目录里找了这个菜单项

.local/share/applications/wine/Programs

下面要做的就很简单了,不必多说。

php程序优化的几个关键点

1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

2、$row[’id’] 的速度是$row[id]的7倍。

3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

5、注销那些不用的变量尤其是大数组,以便释放内存。

6、尽量避免使用__get,__set,__autoload。

7、require_once()代价昂贵。

8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

10、函数代替正则表达式完成相同功能。

11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14、用@屏蔽错误消息的做法非常低效,极其低效。

15、打开apache的mod_deflate模块,可以提高网页的浏览速度。

16、数据库连接当使用完毕时应关掉,不要用长连接。

17、错误消息代价昂贵。

18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

19、递增一个全局变量要比递增一个局部变量慢2倍。

20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

24、派生类中的方法运行起来要快于在基类中定义的同样的方法。

25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返 回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
(举例如下)

if (strlen($foo) < 5) { echo “Foo is too short”$$ }

(与下面的技巧做比较)

if (!isset($foo{5})) { echo “Foo is too short”$$ }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java 代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变 量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好 主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

36、并非要用类实现所有的数据结构,数组也很有用。

37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

38、当你需要时,你总能把代码分解成方法。

39、尽量采用大量的PHP内置函数。

40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;

44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

48、多维数组尽量不要循环嵌套赋值;

49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

50、foreach效率更高,尽量用foreach代替while和for循环;

51、用单引号替代双引号引用字符串;

52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

53、对global变量,应该用完就unset()掉;

from http://www.helion.name/?post=7