微软notepad的bug

来源:互联网 发布:tomcat 8.5 java 编辑:程序博客网 时间:2024/05/19 08:04
一个有趣的实验,打开记事本,在里边输入“联通”两个字,记住是只输入“联通”这两个字。然后关闭记事本,然后再打开。有什么情况?乱码了吧!联通够倒霉的哈。其实这是notepad的一个BUG,这个BUG正是编码以及windows系统打开文件使用“猜”这种方式来确定编码所引起的。
       这个现象怎么 解释呢?
       我们都知道编码有很多种,常见的几种编码有ANSI,UNICODE,UTF-8,GB2312等。记事本的默认的保存文件的编码格式为ANSI编码,文件保存并关闭后,当再打开以后,操作系统就要猜想这个文件时以什么格式保存的了。只有格式猜对了才能将文本正确显示。但是很不幸,有段编码它是无法识别是什么格式的。即当txt文档中一切字符都在 C0≤AA≤DF 80≤BB≤BF 这个范围时,notepad都无法确认文档的格式。也就无法正确显示了。而”联通“这两个字正好都在这个范围内,所以打开的时候notepad无法知道这个文件当时是以ANSI格式保存的,所以就以其他的编码方式打开,结果就出现了乱码。
      WINDOWS是如何猜编码的呢?
      在windows系统中打开文件时,是使用了猜的方式选择解析文件内容编码系统,如果文件开头两个字节是0xFF和0xFE,win系统认为 UNICODE编码,否则为ANSI编码,如果是ANSI编码继续分析,如果一个字节大于127,就证明这个字节与后面的字节组成了一个汉字。所以windows中文系统下,文件是ANSI格式保存的,那么就会用gb2312方式转换,如果是日文系统,就会使用日文方式转变,但是绝对不能说ansi文件里面有中文字符就是gb2312!
     ANSI的疑惑。
     我们都知道8位的ANSI只能编码256个字符,表示英文字母还行,对于汉语,日语,这些语言它就无法表示了。但是保存为ANSI格式的中文却能在中文的操作系统下正常显示,但是却无法在日文或者英文的操作系统下显示,这是为什么呢?这里有一个规则,那就是在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 当然对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ASNI编码与Unicode编码之间最大也最明显的区别。
0 0
原创粉丝点击