查看: 3344|回复: 7
收起左侧

[讨论] 这是win10系统漏洞还是什么原因?关于在文本文档中输入“联通 ”的奇怪现象~~

[复制链接]
马云波波波
头像被屏蔽
发表于 2016-10-15 18:37:43 | 显示全部楼层 |阅读模式
本帖最后由 马云波波波 于 2016-10-15 18:38 编辑

最新版的 windows10 系统。

1、在桌面上点右键,选择新建 - 文本文档;
2、打开“新建 文本文档“,录入“移动“两字后存盘退出;
3、重新打开“新建 文本文档“,看到什么了?
4、还是刚刚录入的“移动“两字?
然而
1、在桌面上点右键,选择新建 - 文本文档;
2、打开“新建 文本文档“,录入“联通“两字后存盘退出;
3、重新打开“新建 文本文档“,看到什么了?
4、显示的不是刚刚录入的“联通“两字,取而代之的是个烧焦的手机电池的摸样?

不知道这究竟是怎么回事, 望高手指点迷津~~
chānwàng
发表于 2016-10-15 18:41:20 | 显示全部楼层
文本编码。你用word打开看看。


以下 copy
这是一个字符编码应用的奇怪现象,讲的明白点,可以说是记事本开小差了!记事本为什么会犯错误?记事本犯了怎样的错误呢?也许你会迫不及待的想知道这些问题,如果是这样,我不会让你空腹而归的。
      在简体中文操作系统中默认的本地字符集编码是GBK编码,除非你在保存记事本文本文件时候选择了其他编码方式,否则用记事本录入的字符信息将使用GBK编码进行储存。巧合的是,“联通”这两个字符的GBK编码具有UTF-8编码的特征,记事本犯下的错误正是将GBK编码存放的记录有“联通”两个字符的文件误认为UTF-8编码的文件。或许你会问,UTF-8编码的文件不是以“EF BB BF”三个特殊字节开头吗?既然这样,记事本怎么会犯这么低级的错误呢?没错,UTF-8编码规定使用UTF-8编码的文件以“EF BB BF”三个特殊字节开头,但并不是强制性要求,早期的UTF-8编码文件就不遵循这个规定。因此记事本不能依靠文件的开头字节判断一个文件是否是UTF-8编码,而只能对文件中的数据进行简单的编码分析来确定。正是这个原因,才有了字符编码应用中的这个奇怪又无法避免的现象。

[细节]
      如果上面的解释对于你来说只是杯开胃红酒,那我还是块点把主食呈上吧,一份大峡谷香烤猪肋排。UTF-8编码采用1-3个字节对字符进行编码,编码字节数与字符的Unicode编码值有严格的对应关系,让我们回忆下UTF-8编码和Unicode的对应关系吧。

      Unicode编码值                              UTF-8编码结构
      \u0001 - \u007E                           0XXXXXXX
      \u0080 - \u07FF 和 \u0000            110XXXXX 10XXXXXX
      \u0800 - \uFFFF                            1110XXXX 10XXXXXX 10XXXXXX

      “联通”这两个字符的GBK编码值是“C1 AA CD A8",GBK编码方式使用两个字节对一个字符进行编码,因此以GBK编码方式存放的录有“联通”两个字符的文件的大小为四个字节。接下来分别观察“联通”这两个字符GBK编码值的二进制形式,你有发现有趣的事。

      联    GBK    十六进制:C1 AA    二进制:1100 0001,1010 1010
      通    GBK    十六进制:C1 AA    二进制:1100 1101,1010 1000

      请注意上面二进制数据的着色部分,你想到了什么?对,它们和UTF-8编码结构中的补充位完全一致,UTF-8编码的补充位使得编码值更有规律,而记事本刚好凭借这个特征区分UTF-8编码的文件。存有“联通”两个字符的文件的所有数据都符合这个特征,就是这样,记事本彻底的将文件误认为UTF-8编码的文件。
      将错就错,让我们来看看这个错误是怎样收场的。如果把“联通”的GBK编码值当作UTF-8编码值,那文件就成为一个写有数据“C1 AA CD A8”并以UTF-8编码的文件,当使用记事本再次打开的时候会看到什么呢?只要将UTF-8编码转换成Unicode编码就知道了。UTF-8编码“C1 AA CD A8”转换成Unicode编码后,编码值为“6A 00 68 03”(转换方法请参考本Blog中的《字符编码》一文)。0x006A这个Unicode编码值位于\u0001 - \u007E之间,若要转换为UTF-8编码,显然只能用一个字节进行编码,因此“联”的GBK编码“C1 AA”虽然特征上貌似UTF-8编码,但它却不对应任何一个UTF-8编码。接着看0x0368这个Unicode编码值,这个值对应了字符“ͨ”,这也正是我们将在记事本中看到的内容。或许你会说我看到的是一个黑色矩形啊,这只是字体的原因,你将字体改为宋体或者其他字体,看到的就是字符“ͨ”。
      对于中文字符,UTF-8编码要用三个字节进行编码,因此,如果你使用记事本录入“联通”,然后选择以UTF-8编码方式保存的话,文件大小应为9个字节(包含三个字节的开头数据),而同样的文件GBK编码却是4个字节。最后附上“联通”的GBK、UTF-8、Unicode编码值,以及记事本的错误思维。

      联通  GBK  C1 AA CD A8    UTF-8  E8 81 94 E9 80 9A    Unicode  54 80 1A 90
      联通  GBK  C1 AA CD A8    UTF-8  C1 AA CD A8            Unicode  6A 00 68 03  (将GBK值误认为UTF-8值的结果)
T.Yoshiyuki
发表于 2016-10-15 18:49:08 | 显示全部楼层
請詳述你的系統環境
要確認的多着呢——
1、你系統的區域和語言選項
2、你打開txt文檔使用的軟件
3、你輸入文字使用的輸入法
4、你保存文檔使用的編碼
……

總之我這裏沒出現這種情況
win10 10586.603
1、我系統的區域和語言選項 - 日文;對非unicode程序使用日文編碼
2、我打開txt文檔使用的軟件 - 秀丸x64
3、我輸入文字使用的輸入法 - PIME 0.15 簡體模式
4、我保存文檔使用的編碼 - unicode (UTF16)
……
驭龙
发表于 2016-10-15 18:54:11 | 显示全部楼层
本帖最后由 驭龙 于 2016-10-15 18:58 编辑

格式→字体,脚本设置为中文,一切正常,但需要二次重新保存

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
wh759626933
发表于 2016-10-15 19:06:28 | 显示全部楼层
出现了,按照4楼改后没有复现
饭@avast
发表于 2016-10-15 20:20:40 | 显示全部楼层
编码问题。

你发错区了。
yaocai321
发表于 2016-10-15 23:07:07 | 显示全部楼层
当年学编程的时候 老师还特意说过
1006590767
发表于 2016-10-16 09:17:50 | 显示全部楼层
太深奥了,看不懂
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-11-25 07:36 , Processed in 0.174560 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表