2007年3月

从blog反向链接统计中找到一个。google一下了自己的id的链接 居然发现以前做的一些美工页面看起来也不太难看
比如南开BBS年华
1  2  (含applet程序)
Eling比赛

转载如何早起
作者: onebird
发布时间: 2007-03-04 20:11
分类: 技术

早期能让自己有更多不受干扰的工作和思考时间。
转载一篇来自LifeBang的如何早起

所谓编码转换是将字符文本用一种编码的值表示转换成另一种编码的值表示。编码的转换过程需要用到两种编码的映射表。不过这一个映射过程的转换已经有开源的库libiconv实现了。在编码转换过程其实很简单。难的是:1文本源编码的识别。(这个我们以后再讨论讨论,假设我们已知源编码)2编码不纯粹。文本中某个字符损坏了,如丢了一个字节。或者夹杂了若干别的编码的字符。
具体来说
iconv转换要求从一个正确的开始位置开始转换。iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);如果开始位置不是一个完整字符,如mybuf="我的好朋友" inbuf=mybuf+1转换则会出错。如果开始位置正确但是中途遇到某个字节的杂质,则转换也会停止返回错误退出。剩下的文本就不处理了。但是我们留心ie或者firefox就会发现,虽然某些网页也有文件中含有别的编码字符或者残缺的字节。浏览器会对这个别字节用问号(有的用别的符号)代替。跳过这些字符又显示正确了。但是如Cterm之类的许多其他软件软件,再遇到半个汉字的情况整个文本都会显示乱码或者截断不能显示。这差别是怎么就是由于文本中的杂质导致转换失败或者雪崩错乱(如GBK编码识别连续错位一个字节)。其实是利用字符编码的一些规律。举2个典型例子如下utf8转换倒别的编码的情况。由于utf8 二进制 第一个字节不会以10开头 0xc0; 其它字节都以10开头。a 所以遇到转换失败时候,从转换失败处跳过一个字节,然后连续跳过所有不符合此规则的字节。b 遇到符合要求的字节开始重新用iconf转换。重复以上两个过程即可。转换成代码则是:
while(inbytesleft>0){                while((inbytesleft>0)                        &&(inbuf!=''                        &&(( (unsigned char )inbuf&0xc0)==0x80))                        //0xc0 == 11000000b ; 0x80 == 10000000b                {                           //skip rot                        inbuf++;                        inbytesleft--;                }                   if(inbytesleft<=0 || (inbuf=='') break;                iconv_ret =                      iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);                if(iconv_ret<0){                        inbuf++;                        inbytesleft--;               }iWriteBytes = outbuf - pszLocale;        iconv_close(cd);}                                            GBK转倒别的编码比较麻烦。因为GBK每个字符之间没有明显的边界(UTF8字符第一个字节都不以10开头).所以GBK遇到杂质字节错误终止可能会连续错一小片直到某个条件发生。这个条件也是利用GBK编码的特征。和过程ab不同的是跳过杂质尽快找到一个正确字符开头的条件如下 1if( ((unsigned char )inbuf<0x40)   )//不在GBk编码空间外 必定为ascii 雪崩停止2if( ((unsigned char )(inbuf+1) != '' && (inbytesleft>2)){if(  ( ((unsigned char )inbuf)<0x80 )  && ( (*(unsigned char *)inbuf)>=0x40 ){ // 落在0x80-ox40之前 必定为中文第二个字节 或者 英文,直接取下一个>    字节即可