用Photoshop制作透明背景的gif图片

16 4 月, 2009

1. 先用图片查看器打开图片,并复制到剪贴板。图片查看器比如ACD See、Photoshop、画图、IconXP等等。

2. 打开Photoshop,点“文件”菜单的“新建”命令,背景内容选“透明”,其它使用默认,然后确认。

3. 点“编辑”菜单的“粘贴”命令把剪贴板的内容粘贴到新建的图上。

4. 用“魔棒工具”,容差设为0,取消“消除锯齿”和“用于所有图层”选项,钩选“连续的”选项。用魔棒分别选中定位背景的部分,点Delete键删除颜色,删除后会显示有网格的透明背景。

5. 删除完背景的颜色后点“文件”菜单的“存储为”命令,格式选择“gif”,然后点“保存”。

6. 在下一步的索引颜色选择窗里确保“透明度”被选中,其它则默认,然后确认。

转贴:字符编码笔记:ASCII,Unicode和UTF-8

10 4 月, 2009

作者:阮一峰 发表于 2007年10月28日

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料。

结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚。

下面就是我的笔记,主要用来整理自己的思路。但是,我尽量试图写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识。

1. ASCII码

我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

2、非ASCII编码

英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256×256=65536个符号。

中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。

3.Unicode

正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表

4. Unicode的问题

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。

5.UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

下面,还是以汉字“严”为例,演示如何实现UTF-8编码。

已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

6. Unicode与UTF-8之间的转换

通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。

在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。


面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。

1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。

3)Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。

4)UTF-8编码,也就是上一节谈到的编码方法。

选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。

7. Little endian和Big endian

上一节已经提到,Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。

那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

8. 实例

下面,举一个实例。

打开”记事本“程序Notepad.exe,新建一个文本文件,内容就是一个”严“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

然后,用文本编辑软件UltraEdit中的”十六进制功能“,观察该文件的内部编码方式。

1)ANSI:文件的编码就是两个字节“D1 CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的。

2)Unicode:编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。

3)Unicode big endian:编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。

4)UTF-8:编码是六个字节“EF BB BF E4 B8 A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。

9. 延伸阅读

* The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets(关于字符集的最基本知识)

* 谈谈Unicode编码

* RFC3629:UTF-8, a transformation format of ISO 10646(如果实现UTF-8的规定)

(完)

 

粥粥从昨天开始可以自己站超过半分钟了

4 4 月, 2009

 昨天粥粥离11月龄还差整整两周,晚上在陪他玩时发现他可以独立站着超过半分钟,还能自己调整两只小脚以保持平衡,看了让做爸妈的很兴奋,小家伙没有辜负爸妈的养育。

今天站的时间和次数更长更多了,希望小家伙早日学会走路,以减轻爸妈的负担,还可以全家一起出去玩。

删除远程桌面连接(mstsc)历史记录的方法

2 4 月, 2009

1. 运行注册表编辑工具regedit,进入到HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client项,删除Default和Servers两项。
2. 再删除我的文档My Documents下Default.rdp文件。

批处理代码:
@echo off

echo Remove from registry
set TEMP_REG=”%TEMP%\remove_mstsc_history.reg”
echo %TEMP_REG%

echo Windows Registry Editor Version 5.00>%TEMP_REG%
echo.>>%TEMP_REG%
echo [-HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default]>>%TEMP_REG%
echo.>>%TEMP_REG%
echo [-HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers]>>%TEMP_REG%

regedit /s %TEMP_REG%
del %TEMP_REG%

echo Remove from My Documents
set DEFAULT_RPD=”%USERPROFILE%\My Documents\Default.rdp”
echo %DEFAULT_RPD%

attrib -h -r -s %DEFAULT_RPD%
del %DEFAULT_RPD%

上面批处理内容的原始文件:remove_mstsc_history.bat.txt (下载后把.txt去掉,然后双击运行即可)

粥粥今天会对着父母叫爸爸妈妈了

28 3 月, 2009

粥粥模糊的叫爸爸妈妈有几天了,一般都是乱叫的,今天晚上在看电视时外婆抱着他,他竟然对着父母叫起爸爸妈妈来,我们都很高兴,特此记录一下。

解决C#中ListView控件动态添加项时闪屏的问题

26 3 月, 2009

解决原理:重载ListView控件,让控件支持Double Buffer。

重载的Double Buffer类代码如下:
    /// <summary>
    /// This override list view support double buffer to avoid the twinkling when insert a new item dynamically
    /// </summary>
    public class DoubleBufferListView : ListView
    {
        public DoubleBufferListView()
        {
            SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
            UpdateStyles();
        }
    }
 

摘自:http://www.wewill.cn/n21083c67.aspx

MySQL 重新安装时服务启动失败的解决实例

25 3 月, 2009

 在重新安装系统后再重新安装MySQL同时希望以前的数据能保留下来,一般是直接覆盖安装到原来的文件夹,此时经常会出现服务启动失败的情况。

在经过多次有反复卸载/安装仍失败后我在网上查找解决办法,没有找到真正的解决办法但找到一些提示,经过我的实际操作把这个问题解决了,这里说一下解决办法。

1. 安装成功后继续配置向导直到最后出现服务启动失败界面(配置向导参见Apache+PHP+MySQL配置),点“取消(Cancel)”退出安装。

2. 打开mysql安装目录下的data子目录,找到“<计算机名>.err”文件,用记事本打开,找到最后一段错误原因,比如:
InnoDB: Error: log file .\ib_logfile0 is of different size 0 37748736 bytes
InnoDB: than specified in the .cnf file 0 36700160 bytes!
090325 12:31:20 [ERROR] Default storage engine (InnoDB) is not available
090325 12:31:20 [ERROR] Aborting

090325 12:31:20 [Note] F:\mysql5.0\bin\mysqld-nt: Shutdown complete
错误原因是日志文件实际大小与配置文件中设置的大小不一致。这里日志文件的实际大小是37748736 bytes(=36M),而配置文件中设置的大小是36700160 bytes(=35M)。
bytes换算成M的公式是:实际大小/1048576,即1M=1048576bytes,如37748736bytes/1048576=36M。

3. 打开mysql安装目录下my.ini文件(老版本可能安装在%windir%目录下),打开可以找到“innodb_log_file_size=35M”一行,修改成“innodb_log_file_size=36M”,然后保存。

4. 启动MySQL服务(方法1:服务控制台启动;方法2:“net start mysql”命令行启动;方法3:重启系统自启动),一般可以解决此类问题。

这种情况下,即使第1步设置root密码与原来的密码不一致也不会影响服务的启动,在登录MySql Command Line Client时会自动验证root的密码,只有用原来正确的root密码才能登录。

信用卡帐单日的最优选——充分使用免息期

20 3 月, 2009

本人现有三张信用卡:工行中油国际信用卡、建行龙卡、招行携程信用卡。其中除了工行不可以修改帐单日外,其它信用卡都能修改。不过建行修改帐单日也有限制:
目前建设银行龙卡信用卡的账单日有每月7日、10日、12日、15日、17日、22日、25日和27日。我们可以根据自己的财务情况向建设银行信用卡中心提出调整账单日要求,但在有效期内只能调整一次账单日

为了能充分的使用这些信用卡的免息期(至于为什么这个做,各人自己去理解),我制作了一张表如下:

通过调整第2行帐单日的日期计算出具体某一天消费时的免息期,比较这些免息期可以得出我这三张卡中最优的帐单日分别是:1、17、17。

简单解释一下:
1. 工行的帐单日是只能是1日。
2. 工行和建行的信用卡可以设置消费到一定额度使用密码,而招行只能要么设密码要么不设,因此招行卡留在家里,只用于网上消费。
3. 工行卡可以配上U盾在网上消费,建行不能网上消费,所以采取工行单独使用、建行和招行组合使用的方法。
4. 这样通过信用卡的热线电话修改好帐单日以后,在17日之前只刷工行,从17日开始只刷建行和招卡(仅网上消费),那么每笔消费的最小免息期是35天。

由于我的建行龙卡已经修改过一次帐单日,所以只能等到6月份过了有效期换新卡后才能修改,先修改招行的再说。

修改帐单日后请注意自己的还款日,以免延误还款!

2009-03-22 Updated:打了建行的信用卡热线,答复是自己名下的所有信用卡终生只允许修改一次帐单日,决定销卡。

上面表格的Excel文档:信用卡使用.xls

半个多月的雨天过去了,总算可以在315这天去科技馆玩耍了

16 3 月, 2009

一路上是坐着车去的

到科技馆外面的草坪铺块防潮垫,演示一下爬功

在老爸睡觉的时候偷偷的玩他的黑莓手机

还有钥匙

然后到上海2010年世博会的吉祥物下秀一下

这是特写

再秀一下新买的风车,虽然现在只剩下四片叶子了

最后露一下小牙

PC浏览上打开Google Latitude的步骤

16 3 月, 2009

Google提供了Latitude功能,中文叫“纵横”,可以通过手机上的SIM卡获取基站位置或GPS来定位,但Google Latitude只是一个插件,需要做一些设置才能显示这个插件,这里把如何显示这个插件以图示方式简单说明一下。

首先我们在浏览器的地址输入google主页的地址http://www.google.com

如果当前浏览器设置的默认google首页是中文,则显示如下图的中文首页,如果默认是英文首页则跳入下一步:

此时需要点右下角的“Google.com in English”链接切换到英文首页,如下图:

在Google英文首页,可以点“Go to Google China”可以回到中文首页。注意右上角的iGoogle和Sign In链接,点iGoogle进入“我的Google主页”。如果没有登录下一页会显示Sign In链接,点Sign In链接进入登录页面如下图:

输入google的帐户(即是gmail的帐户)和密码点“Sign in”登录,可以打开iGoogle页面。如果已经将Google Latitude添加进iGoogle,则显示如下图:

到这里就完成了打开Google Latitude的步骤。点地图上的加/减号可以放大/缩小,点右上角的最大化按钮可以最大化Google Latitude插件,点地图下面的左/右箭头可以切换查看好友的位置。

点上图的最大化按钮会显示最大化插件,如下图:

在此界面,点右上角的“恢复窗体”按钮可以回到iGoogle主界面。在iGoogle界面随时都可以点页面右上角的Classic Home回到Google的英文首页。

在最大化界面,点Map可以切换地图模式,如下图:

如果没有在iGoogle首页添加Google Latiude插件,则需要在浏览器的地址栏输入http://www.google.com/latitude,如下图:

打开网页后点如下图的Add Latitude to iGoogle链接将Google Latitude添加到iGoogle首页: