微软为什么和联通有仇

本贴最后更新于 2439 天前,其中的信息可能已经事过境迁

网上流传着一个笑话,说微软和联通有仇,内容大致如下:如果你的电脑操作系统是 WIN2000 或 WINXP,那么: 

  1. 在桌面上点右键,选择新建 — 文本文档; 
  2. 打开"新建 文本文档",录入 移动 两字后存储后关掉 
  3. 重新打开"新建 文本文档",看到什么了?是不是刚刚录入的"移动"两字? 
  4. 移动 分别换成 电信网通,重复 1--3 步,是不是也都没什么问题? 
  5. 现在我们拿 联通 来试试,重复 1--3 步,你会发现刚刚录入的 联通 两字不见了,取而代之是个烧焦的手机电池(一个符号)。 看来微软确实跟联通有仇呀!

笑话当然是笑话,不能当真。但为什么会这样呢?是微软的 bug 吗?确实有点像,不过——微软是世界顶级的软件公司,记事本则有可能是 windows 中最简单应用程序,说这是 bug 未免有点不合情理吧?

好了,既然把自己的主观臆断否定了,就让我们踏上寻找事实真相的艰苦历程吧:)。

不知你注意过没有,记事本的打开、保存对话框比普通的文件对话框多一个编码选项,可以通过它指定文件的编码是 UNICODEANSI 还是 UTF8。"喔,我知道了",你可能会说,"这肯定是 Windows API IsTextUnicode 惹的祸。因为文本文件本身不保存编码信息,所以记事本打开文件时就要调用 IsTextUnicode 来判断文件的编码。而 IsTextUnicode 是根据文本的内容猜测其编码,所以肯定是它猜错编码格式了。想想‘联通'只有两个字,这样的错误有情可原,OK 了,问题解决了"。

说实话,一开始我也是这么想的,但后来发现,我犯了两个错误:

  1. IsTextUnicode 并没有猜错,不信你可以检查一下 IsTextUnicode("联通", 4, NULL) 的返回值。
  2. 记事本有可能保存编码信息,这个后面再说。

原来,记事本除了判断编码是不是 UNICODE 以外,还要判断它是不是 UTF8。"联通"两个字的代码是(字节顺序从低到高):C1 AA CD A8,转换为二进制是:11000001 10101010 11001101 10101000。对照 UTF8 编码方案(详情请见 http://www.cis.ohio-state.edu/htbin/rfc/rfc2279.html): 

  • 0000-007F 之间的字符不做转换
  • 0080-07FF 之间的编码为 110xxxxx 10xxxxxx
  • 0800-FFFF 之间的编码为 1110xxxx 10xxxxxx 10xxxxxx 

不难发现,"联通"的编码符合第二种情况,所以记事本把它判定为 UTF8 编码,而对其进行解码后,将变成 00000000 01101010 00000011 01101000。注意:前两个字节解码后并不在 0080--07FF 之间,所以被认为是错误的值,忽略了。后面两个字节经过调整字节顺序后,将变为 16 进制的 0x0368,也就是那块烧毁的电池了(取决于所使用的字体)。

PS:

  1. 如果你保存文件时,指定使用除 ANSI 以外的编码,记事本将用文件开头的几个字节保存文件编码,UNICODE 对应 0xFEFFUNICODE BIG ENDIAN 对应 0xFFFEUTF8 对应 0xBFBBEF。这几个字节被称为 BOM(byte order mark, 字节顺序标记)。如果文件有 BOM,记事本直接使用它判断编码,否则它就根据文件内容判断编码。

  2. 分析的过程中我用 UltraEdit 来查看文件的 16 进制内容,但它会自动进行编码转换并给文件加上一个 BOM,导致看到的和实际不符(文件 4 字节,到了 UltraEdit 中就成了 6 字节),让我走了一些弯路。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3454 回帖 • 187 关注
  • 技术

    到底什么才是技术呢?

    88 引用 • 179 回帖 • 4 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    223 引用 • 474 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • DevYui

    测试了一下,还真是。

    imagepng

    imagepng
    关于编码的问题以前想过,在想存一个字或几个字时编辑器会不会读取错误。看来有人发现了。

推荐标签 标签

  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 220 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 586 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 2 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 138 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 613 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 402 关注
  • 导航

    各种网址链接、内容导航。

    42 引用 • 175 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 368 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 3 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 49 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    30 引用 • 96 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    6 引用 • 14 回帖 • 2 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 247 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 626 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 927 回帖
  • 安全

    安全永远都不是一个小问题。

    201 引用 • 816 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 624 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 335 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注