记事本的一个BUG

我们常用的小工具,系统中附件里的“记事本”工具,有个比较有意思的BUG,让我们按以下步骤来看看。
    1. 在开始菜单的附件里打开记事本
    2. 复制引号中的内容,粘贴到记事本里“AAAA BBB CCC DDDDD”
    3. 把它保存到桌面上,文件名任意,然后关闭记事本程序
    4. 在桌面上打开刚才保存的文件
    现在看到的都是一个个黑色的格子。而刚才输入的内容都不见了,是不是很有意思呢,我们再把记事本删除,再粘贴一下刚复制的内容,保存并关闭记事本。再次打开该文件,现在又可以正常显示文件内容了,呵呵是不是很有趣呢。
    在实验中发现,如果打开记事本,输入“联通”也可以达到同样的效果,呵呵,我们可爱的记事本是不是非常有趣呢。

我对windows记事本bug的解释
这个bug在windowsXP sp1,sp2中都用,其他版本的windows是否有我没试过,不过我估计windows2000和2003都会存在。
bug演示:
记事本新建一个文本,打开以后输入: 联通 这两个字, 保存 ,关闭记事本。
再打开,你看看变成什么了?
有一个开玩笑的说法是因为中国联通把微软中国得罪了……
其实我看就是微软中国那帮家伙水平不行,对多语言编码弄得不好造成的
我分析了一下原因,
记事本保存的时候,默认使用ansi编码
但是用ansi编码呢,联通这两个字的开头正好是:fffe..... 这样的,于是再打开呢,他就以为是utf-8编码了,但是按照utf-8来解码呢,却造成乱码了。
我解释完毕,你满意否?
之所以我会想起来解释这个bug,是由于最近开发一个软件涉及到一些编码方面的问题,微软windows这个bug弄得我的软件生成的文件到现在还无法正常移植到其他平台上。
呵呵
shinzeal 2005-1-29 04:53 PM
我再具体进行分析一下:
以下是“联通”二字在不同编码下的16进制代码:
FF FE 54 80 1A 90 (Unicode)
FE FF 80 54 90 1A (Big Unicode)
FF FE 54 80 1A 90 (UTF-8)
FF FE 6A 00 68 03 (ANSI)
可以看出来,Unicode和UTF-8编码下,联通二字的编码是一样的,而Big Unicode是和Little Unicode(简称Unicode)正好相反的编码方式,一般Intel体系的计算机用Little Unicode编码效率较高。而文件头FF FE和FE FF则被微软用来作为区分文件是Little Unicode还是Big Unicode的标志。同时呢,由于UTF-8也是缘于Unicode编码方式的,微软就在UTF-8编码的文件前面也加上了FF FE用来作为标志。
可是这样一来,用ANSI编码保存的文件就出问题了,因为联通二字的ANSI编码正好是以FFFE开头的,这样以ANSI编码保存以后再次打开,记事本首先检测到FFFE,就认为是UTF-8编码了,于是按照UTF-8编码打开以后就会显示为乱码。
利用这个原理,大家可以试试,找到以ANSI编码保存时开头为FFFE的其他文字,同样可以实现和 联通二字在记事本中造成的bug一样的效果


Bink.nu网站上的文章表示,微软的记事本程序中又发现一个有趣的BUG。事情经过是:
  1、打开一个记事本程序;
  2、输入:AAAA BBB CCC DDDDD(或者任何其它4-3-3-5形式的字母组合);
  3、保存文档,关闭记事本;
  4、再次打开刚才保存的文档,你会发现那些字母变成了9个矩形格子(显示效果:?????????
)。
  5、此外,把记事本中的格子再次用刚才那些字母序列覆盖,保存并关闭记事本。再次打开时,显示的又是正确的字符序列了。
  老王的扩展:当进行完上述5步后,我想是不是这个BUG只在新建文档时有效呢。于是我在第5步后用“CTRL+N”新建了一个记事本文档,输入那些字母,保存为一个新文件,打开它时现实的确是正确的。而经测试,只有在没进行过上述1-3步操作的记事本文档中才有这个BUG存在。比如在一个已存在的文档中操作,或是到“开始-程序-附件”中启动记事本操作,或是查看网页源代码弹出的记事本中操作等。一个文档一旦应用过本BUG,即使在打开它的窗口中新建一个一般文档-保存-打开新建的文档,粘贴/输入上述字母也无法看到BUG了。
  所以这个BUG确实很有趣,至于原理是什么,估计得去问微软设计记事本的那位老兄了。关于本BUG存在于哪些系统中我没有条件测试,反正我的系统是Windows XP。
更新:monyer兄弟的解释
  这是个文件编码识别问题,我们第一次建立文件保存时使用的是默认ANSI格式,通过打开记事本,输入以上字符另存为*.txt那个界面即可看见编码方式。
  但打开的时候是按Unicode编码打开的,我们再次输入以上字符另存为*.txt,在另存为界面可以看到编码方式已经更改了。
  这个是记事本的智能化编码识别问题,譬如ANSI、Unicode、Unicode Big Endian、Utf-8、Utf-8 bom、GB2312、Big5、ASCII等。我们从来没有意识到简单的文本居然有这么多编码就是因为记事本程序的智能识别问题,但究竟程序员做这个智能识别用了什么算法就不得而知了,不过可以肯定的是不是简单的fffe文件头识别就是了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值