看看UTF-8编码就知道了。
UTF-8以字节为单位对Unicode进行编码。
从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) ║ UTF-8 字节流(二进制)
000000 - 00007F        ║ 0xxxxxxx    
000080 - 0007FF        ║ 110xxxxx 10xxxxxx    
000800 - 00FFFF        ║ 1110xxxx 10xxxxxx 10xxxxxx    
010000 - 10FFFF        ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx     UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。因为bf 不是在0x00-0x7F之间,所以在ascii表找不到。判断一个文本编码是否是UTF-8编码的最简单的正则: 
 /^([\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/  上述正则并不是100%能够判断正确的。事实上也没有100%正确的方法。一个Base Case就是文章开头提到的“联通”例子,“联通”的GBK编码是c1 aa cd a8,刚好符合了上述的正则表达式,被Windows记事本认为是UTF-8来编码了。  联通的Base Case还不是最Bad的,假如c1 aa cd a8是UTF-8编码,c1 aa对应到Unicode的十六进制表示是6A(字符j),只需要一个字节就可以表示了。所以c1 aa不是一个规范的UTF-8编码,虽然c1 aa可以通过简单的正则表达式验证。  下面是一个更Bad的Case,记事本输入“伞”,关闭后再打开,就变成拉丁字符ɡ了,对于这样一个文本文件,如果不额外告诉程序是什么编码的,程序当UTF-8和当GBK来处理都不是程序的错了。  那么哪些汉字会引起当作UTF-8来误读的情况呢?根据正则表达式和GBK的编码情况(全国信息技术标准化技术委员会汉字内码扩展规范(GBK)码:
http://www.snwei.com/studypc/write/009.htm ),在[\xc0-\xdf][\x80-\xbf]之间的GBK编码的汉字都可能会有问题,只要GBK编码的文本文件中的字符都是落在这个范围内(包括有任意的其它ASCII字符的情况,比如“伞1”也会被当作UTF-8来处理),都会出现编码难以或者不能判断的情况。