• 编码与工具


    1、使用UltraEdit修改当前编辑的文本的编码

        第一种方式:File -> Conversion

        第二种方式:View -> Set Code Page

       如果要在十六进制模式下编辑可以按Ctrl+H

     

    2、对GBK编码的一个普遍误解

        根据维基百科上的说明,GBK编码字符的方式包括一字节和双字节编码,007F范围内是一位,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81FE(也就是不含80FF),第二字节的一部分领域在407E,其他领域在80FE。即:

        高字节:0x81~0xFE 低字节:0x40~0x7E 0x80~0xFE(即排除了xx7F)

        GBK的编码范围如下表:

    范围第1字节第2字节编码数字数
    水准 GBK/1 A1A9 A1FE 846 717
    水准 GBK/2 B0F7 A1FE 6,768 6,763
    水准 GBK/3 81A0 40FE (7F除外) 6,080 6,080
    水准 GBK/4 AAFE 40A0 (7F除外) 8,160 8,160
    水准 GBK/5 A8A9 40A0 (7F除外) 192 166
    用户定义 AAAF A1FE 564  
    用户定义 F8FE A1FE 658  
    用户定义 A1A7 40A0 (7F除外) 672  
    合计:  23,94021,886

      GBK汉字是双字节编码,而ASCII字符是单字节编码。网上有人这样说:

    GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

    它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。

       这段话我感觉读得费劲,逻辑好像也有矛盾。于是在UltraEdit中查看“汉字编码hi”这段GBK文本,其编码如下:

       可以看出"汉字编码"对应"BA BA D7 D6 B1 E0 C2 EB"这8个字节(2个十六进制对应一个字节),即每个汉字对应2个字节。而"hi"对应"68 69"两个字节,即每个ASCII字符对应1个字节。

       GBK编码的汉字的特征是:占两个字节,并且第一个字节的值小于0。所以网上找出一段GBK文本中的汉字的C语言代码实现如下:

    #include <stdio.h>
    
    int main(void)
    {
      char a[10]="C语言";
       int i;
       for (i = 0; a[i]; i++)
       if (a[i]<0) {
          printf("Chinese :%c%c\n",a[i],a[i+1]);
          i++;
       }
       else 
          printf("Not Chinese:%c\n",a[i]);
     
       return 0;
    }

    3、Unicode BOM(Byte Order Mark)

        Unicode几种编码的BOM如下:

    UTF-32, big-endian 文件的前4个byte是:00 00 FE FF
    UTF-32, little-endian文件的前4个byte是:FF FE 00 00
    UTF-16, big-endian文件的前2个byte是:FE FF
    UTF-16, little-endian文件的前2个byte是:FF FE
    UTF-8文件的前3个byte是:EF BB BF
    UTF-7的规律特殊一点,不是前几个byte,而是所有的byte转换为十进制都小于127.
    但BOM没有得到广泛支持,所以不是一定的。

       各种编辑软件在保存文件并指定编码为UTF8时是否带BOM情况:

    1.   notepad
         notepad 在保存时,选择UTF-8 格式,会在文件头写上BOM header.读取文件时,会分析BOM和文件中是否有中文字符,进而做出正确的选择。
     
    2.   notepad++
         可以设置各种格式,有无BOM都支持。
     
    3.   editplus
         文件保存时,选择UTF-8 格式,不会在文件头写上 BOM header.读取可以识别UTF-8
     
    4.   ultraedit
         ultraedit在advanced->configuration中可以选择文件保存时是否写上BOM header.或者另存为中选择。读取是,如果没有设置自动检测UTF-8或者部分无BOM文件会无法正常显示。
     
    5.   Eclipse
         如果设置了文件的编码问UTF-8,那么文件保存为无BOM格式。读取正常。
     
    6.   vi
         指的是Linux下的vim, 如果UTF-8 文件开头有BOM header, 其能够正常显示UTF-8 编码,否则,显示为乱码。

        比如用notepad编辑文本"UTF8编码",然后指定编码为UTF8,保存,再用MadEdit打开如下:

        可以看到U对应的十六进制55之前还有3个字节 EF BB BF,这就是UTF8编码对应的BOM头。而不带BOM头的UTF8编码的情况如下图:

        所以如果处理一段UTF8编码的字符串的字节流时,必须先判断前三个字节是否EF BB BF,即UTF8编码对应的BOM头。

    4、UltraEdit下查看UTF8文本出现“奇怪文字”解决

        在UltraEdit 18.20专业版下查看UTF8文本出现“奇怪文字”,如下(内容正常情况应该是"UTF8编码"):

        搜索了好一会,发现可能是UltraEdit对文件编码类型检测错误导致。于是装了一个新软件MadEdit(与PsPad一起号称可以替代UltraEdit),打开后,就正常了,如下(Alt+3切换到十六进制模式):

    5、为什么记事本选择ANSI编码保存中文,也可以正常显示中文而不乱码?

        在简体中文系统下,ANSI 编码代表 GB2312 编码,《信息交换用汉字编码字符集》是由我国国家标准总局1980年发布,1981年5月1日开始实施的一套国家 汉字编码字符标准,标准号是GB 2312—1980。它是计算机可以识别的编码,适用于汉字处理、汉字通信等系统之间的信息交换。基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码。

    6、一个小实验

         用记事本写 连通 两个字,另存为liantong.txt,并选择编码方式为ANSI。然后再用记事本打开liantong.txt可以发现乱码了。

        而用EmEditor、EditPlus、UltraEdit、Notepad++、Word等打开就能正常显示,原因就是记事本软件在检测文件字符编码上很弱。

        上面的liantong.txt文件采用的是GB2312编码,如果你再另存为liantong2.txt,并选择编码方式为UTF-8,那么之后用EmEditor、EditorPlus等软件打开也乱码了。然后再打开liantong2.txt,另存为liantong3.txt,又选择ANSI编码,你猜结果会如何?结果是liantong3.txt用EmEditor、EditorPlus打开也乱码,因为在你另存liantong2.txt时,附加了UTF-8 BOM头。导致将liantong2.txt另存为liantong3.txt时信息丢失。是不是很混乱,来几张图就明白了:

        最初liantong.txt采用GB2312编码,十六进制表示如下:

       随后liantong2.txt采用UTF-8编码,十六进制表示如下:

       最后liantong3.txt又采用GB2312编码,十六进制表示如下(在用GB2312编码liantong2.txt中的字节时,发现GB2312中无对应,就用全部用3F代替了):

     

    7、为什么UTF-8编码的文件不加BOM头也可以正常识别?(http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html

      这个问题估计很多朋友都会产生疑问,为什么utf-16不指定就读乱码,而utf-8可以。我们可以从下面的例子看下: utf-8是怎么样从unicode转换而来了
      Unicode编码(16进制) ║ UTF-8 字节流(二进制) 
      000000 - 00007F ║ 0xxxxxxx 
      000080 - 0007FF ║ 110xxxxx 10xxxxxx 
      000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx 
      010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
      从上面看,发现规律没有?第一个自己开头有几个”1”,后面就对应有几个10开头字节了。 这样我们都可以通过正则进行检测了.

            [\x09\x0A\x0D\x20-\x7E]             # ASCII
            |[\xC2-\xDF][\x80-\xBF]              # non-overlong 2-byte
            |\xE0[\xA0-\xBF][\x80-\xBF]         # excluding overlongs
            |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}   # straight 3-byte
            |\xED[\x80-\x9F][\x80-\xBF]         # excluding surrogates
            |\xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
            |[\xF1-\xF3][\x80-\xBF]{3}           # planes 4-15
            |\xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16

       由于它独特的编码存储特点,因此目前常见文本处理软件就能够自动分析出来。(editplus、notepad++等)

     

  • 相关阅读:
    远程连接mysql数据库注意点记录
    一个支持chrome、firefox的全屏插件
    Windows Phone应用程序Tombstone执行模型总结
    Windows Phone页面导航和独立存储开发总结
    【讨论帖】控制分布式缓存“及时”过期的一种实现
    Java HashMap的死循环的启示
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    Analysis Service Tabular Model #003 Multidimensional Model VS Tabular Model 我们该如何选择?
    Analysis Service Tabular Model #002 Analysis services 的结构:一种产品 两个模型
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET 4.0 最新发布版本 下载使用说明
  • 原文地址:https://www.cnblogs.com/feichexia/p/Encoding.html
Copyright © 2020-2023  润新知