查看: 675|回复: 5

[操作系统] 深入了解Windows编码方式

  [复制链接]
  • TA的每日心情
    擦汗
    2016-4-26 10:55
  • 签到天数: 34 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2016-2-25 13:14:55 | 显示全部楼层 |阅读模式
    本帖最后由 Crazwly 于 2016-2-25 13:17 编辑


           1.winhex等工具软件查看记事本中几种编码方式不同.



    1. 新建一个文本文档输入“联通”,再次打开
    Winhex查看:
    这里先要了解Unicode与UTF-8的关系:UTF-8是由Unicode变化而来  X为低八位 Y高八位
      
    Unicode编码
      
    字节数
    表示为二进制
       UTF-8
    0000—007F
    1
    0000  0000到 0111 1111
      
    0XXXXXXX
      
    0080—07FF
    2
    00000000  10000000到
      
    00000111  11111111
      
    110YYYXX 10XXXXXX
      
    0800—FFFF
    3
    00001000  00000000到
      
    11111111  11111111
    1110YYYY  10YYYYXX   10XXXXXX
      
    10000--1FFFFF
    4
    00000001  00000000  00000000到00011111   11111111  11111111
      
    11110XXX  10XXXXXX 10XXXXXX 10XXXXXX
      
    记事本输入“联通”用的是本地字符集GBK

    分析:
    这时我们看看utf8的编码格式:
        UCS-2编码(16进制) UTF-8 字节流(二进制)
       0000 - 007F 0xxxxxxx
       0080 - 07FF 110xxxxx 10xxxxxx
       0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

    在保存这个操作中,windows默认保存的编码是ANSI(实际上应该是GBK)。
    第一二个字节、第三四个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的006A,也就是小写的字母"j",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。

    可以认为,当文档中的所有字符的二进制编码在C0≤AA(第一个字节)≤DF  80≤BB(第二个字节)≤BF时,记事本都无法确认文本的编码格式,就按照UTF-8的格式来显示。

    另外,当我们在记事本编写"联通",然后另存为,选择UTF-8的格式,保存。再重新打开的时候,就不会有乱码。用UltraEdit的十六进制打开可以看到 EF BB BF E8 81 94 E9 80 9A。其中EF BB BF UTF-8编码格式的标记。当用记事本打开文件时,读到EF BB BF 时,就确定这是UTF-8编码格式的字符。所以打开时不会看到乱码。同理与Unicode、UTF-16。
    Unicode的"联通"的十六进制编码:FF FE 54 80 1A 90 。其中FF FE Unicode的标记
    UTF-16的"联通"的十六进制编码为:FE FF 80 54 90 1A。这里的FE FFUTF-16的标记

    ANSI(GBK):


       移动


    记事本检测文件头,UTF-8       按本地字符集解码。

    联通

    上述已解释  出现乱码。误检测为UTF-8编码
    不是UnicodeUnicode big endian
    Unicode:
    移动(unicode 编码\u79fb\u52a8)




    联通(unicode 编码\u8054\u901a)




    Unicode 转换UTF-16 Little-endian: 直接加上文件头FE FF 交换高低八位
    由FF FE文件头知这是Unicode的UTF-16 Little-endian编码方式
    Unicode big endian
    移动




    联通


    Unicode转换Unicode big endian : 直接加上文件头FE FF
    文件头 FE FF 编码方式UTF-16 Big-endi
    UTF-8
      
    0800—FFFF
      
    3
    00001000  00000000到
      
    11111111  11111111
    1110YYYY  10YYYYXX  10XXXXXX
      
    (X低八位)
      
    (Y高八位)

    移动

    “移” 用Unicode编码查看器查看为 \u79fb二进制:   
    0111100111111011 在0800—FFFF之间  转为为UTF8:   11100111 10100111 10111011 16进制:
    “动” 用Unicode编码查看为\u52a8 二进制       00101001010101000 在0800—FFFF之间  转为为UTF-8:
    11100101 10001010 10101000  16进制:
    联通
    “联”Unicode编码 \u8054 二进制 1000000001010100
    转换为UTF-8:11101000 10000001 10010100 16进制  :E88194
    “通” Unicode 编码 \u901a 二进制 1001000000011010
    转换为UTF-8: 11101001 10000000 10011010 16进制:E9809A

    文件头 EF BB BF 编码方式 UTF-8

  • TA的每日心情
    擦汗
    2016-7-27 17:15
  • 签到天数: 82 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2016-2-25 14:07:08 | 显示全部楼层
  • TA的每日心情
    郁闷
    2016-10-14 16:17
  • 签到天数: 123 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-2-26 11:31:19 | 显示全部楼层
    好贴,必须顶一个~!
  • TA的每日心情

    2016-4-10 20:11
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-2-26 11:45:58 | 显示全部楼层
    本人完全的菜鸟一枚,请问这个有什么用吗?我一点基础也没有,求解释。
  • TA的每日心情
    擦汗
    2017-4-25 22:21
  • 签到天数: 790 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-2-26 23:45:58 | 显示全部楼层
    -----------------------------------------------------------------------------

    中国黑帽培训基地!— www.acehat.com


    倾力营造网络新手最佳的学习成长环境和信息资源交流共享平台!


    中国黑帽,帮助中小站长,提高技术,愿与网络技术爱好者共同进步!


    黑帽论坛!— bbs.acehat.com


    ------------------------------------------------------------------------------
  • TA的每日心情
    开心
    2017-8-14 15:18
  • 签到天数: 18 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-3-15 04:45:30 | 显示全部楼层
    很详细,感谢分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    站长推荐上一条 /1 下一条