昊's profile烂笔头记事BlogGuestbookNetwork Tools Help

Blog


    November 21

    126,163邮箱,教育网登陆通道

    教育网用户幸福了,有了专用通道。访问速度大大的提高了。

    126邮箱:http://edu.mail.126.com 或者 http://edu.126.com

    163邮箱:http://edu.mail.163.com

    November 20

    豆瓣验证码

    doubanclaima9716e1d6a65afcc

    Cannot modify header information - headers already sent by...解决方法

    今天把PHP代码用记事本保存为utf编码,就出现了下面提示:

    Warning: Cannot modify header information - headers already sent by (output started at E:\My documents\My Work\zgjdwx\test2.php:1) in E:\My documents\My Work\zgjdwx\include\common.inc.php on line 20

    这个错误是因为在header前面有html输出导致的。因为之前程序运行正常,所以排除了程序的问题。

    经过查询,原来是BOM的问题。

    在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

    UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

    Windows就是使用BOM来标记文本文件的编码方式的。

    PHP也不支持BOM。

    PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以这三个字符将会直接输出。

    用ultraedit打开,对ultraedit进行设置:高级-配置-文件处理-Unicode/utf-8检测,所有选项都不选择。然后会发现文件前面有一个“锘?”,删除掉,然后保存为无BOM的utf编码。 也可用Dreamweaver保存为utf编码。

    总结:如果程序中无中文,可以直接使用ANSI编码。如果存在中文,要保存为无BOM的utf编码。切记不要使用记事本来进行转换。

    November 15

    Ajax乱码问题整理

    今天使用AJAXRequest,返回值中的中文总是乱码。创建AJAXRequest对象时,自带的charset方法并不起作用。

    网上搜了一下,用下面的方法轻松解决了问题。

    产生原因
    主要有2个原因
    1 xtmlhttp 返回的数据默认的字符编码是utf-8,如果前台页面是gb2312或者其它编码数据就会产生乱码
    2 post方法提交数据默认的字符编码是utf-8,如果后台是gb2312或其他编码数据就会产生乱码

    解决的办法就是在送出的流里面加一个HEADER,指明送出的是什么编码流,这样XMLHTTP就不会乱搞了。

    PHP:header('Content-Type:text/html;charset=GB2312');
    ASP:Response.Charset("GB2312")
    JSP:response.setHeader("Charset","GB2312");

    附一个PHP的unicode解码程序

    function utfdecode($url) //unicode解码
    {
       preg_match_all('/%u([[:alnum:]]{4})/', $url, $a);
       foreach ($a[1] as $uniord)
       {
           $dec = hexdec($uniord);
           $utf = '';
           if ($dec < 128)
           {
               $utf = chr($dec);
           }
           else if ($dec < 2048)
           {
               $utf = chr(192 + (($dec - ($dec % 64)) / 64));
               $utf .= chr(128 + ($dec % 64));
           }
           else
           {
               $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
               $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
               $utf .= chr(128 + ($dec % 64));
           }
           $url = str_replace('%u'.$uniord, $utf, $url);
       }
       return urldecode($url);
    }

    Javascript: unterminated string literal解决方法

    Javascript使用document.write(str)进行输出时,常提示下列错误:Error: unterminated string literal。

    通常原因是输出字符str中包含换行符导致的。

    解决方法如下:

    asp:
    str=replace(str,vbcrlf,"",1,-1,1)

    php:
    $str = str_replace("\n", "", $str);
    $str = str_replace("\r", "", $str);

    然后再进行document.write(str)输出。