微软为什么和联通有仇

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

网上流传着一个笑话,说微软和联通有仇,内容大致如下:如果你的电脑操作系统是 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 引用 • 3455 回帖 • 153 关注
  • 技术

    到底什么才是技术呢?

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

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

    228 引用 • 476 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

    测试了一下,还真是。

    imagepng

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

推荐标签 标签

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1443 引用 • 10082 回帖 • 494 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 17 关注
  • Anytype
    3 引用 • 31 回帖 • 24 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    180 引用 • 3878 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖 • 1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 250 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 465 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 650 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 106 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 5 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 27 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 4 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 676 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 311 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • Access
    1 引用 • 3 回帖 • 3 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 762 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 5 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 2 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 7 关注