编码与工具

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,940 21,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打开如下:

编码与工具_第1张图片

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

编码与工具_第2张图片

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

 

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

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

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

编码与工具_第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++等)

转自: http://www.cnblogs.com/feichexia/archive/2012/11/22/2782290.html

你可能感兴趣的:(编码与工具)