黑马程序员技术交流社区

标题: 联通 问题 [打印本页]

作者: 张明星    时间: 2012-3-28 10:20
标题: 联通 问题
新建记事本之后,输入联通,关闭打开后是4个字节的乱码;但是把乱码删掉,重新输入联通,关闭打开后却是9个字节的联通,不再是乱码!同一个文件,两次输入联通,得到的结果却不同,这是为什么??
作者: 鲍亚坤    时间: 2012-3-28 10:37
本帖最后由 鲍亚坤 于 2012-3-28 10:39 编辑

在简体中文操作系统中默认的本地字符集编码是GBK编码,除非你在保存记事本文本文件时候选择了其他编码方式,否则用记事本录入的字符信息将使用GBK编码进行储存。巧合的是,“联通”这两个字符的GBK编码具有UTF-8编码的特征,记事本犯下的错误正是将GBK编码存放的记录有“联通”两个字符的文件误认为UTF-8编码的文件。
  对于中文字符,UTF-8编码要用三个字节进行编码,因此,如果你使用记事本录入“联通”,然后选择以UTF-8编码方式保存的话,文件大小应为9个字节(包含三个字节的开头数据),而同样的文件GBK编码却是4个字节。
作者: djx900    时间: 2012-3-28 14:28
因为联通 适应能力强 谁都能编译成 计算机识别码    联通就是一个 传说中的管死不管埋  的 一个受害者
作者: newlaw2013    时间: 2012-3-28 16:44
/*
    是记事本解码的问题。当用记事本存入”联通“二字时,记事本会用Windows系统默认的编码方式去存,
在简体中文操作系统中默认的本地字符集编码是GBK编码,所以记事本就将”联通“二字用GBK编码的形式
解析成二进制数据存入电脑硬盘中。
    而当打开的时候,因为”联通“这两个字的二进制编码形式正好符合了UTF-8的编码形式。
下面是如下程序的运行结果:
-63
11000001
-86
10101010
-51
11001101
-88
10101000

UTF-8中的编码参考:API文档中java.io----->DataInputStream------>readUTF(DataInput in):UTF-8修改版
   看以上转成的4段二进制码,都符合了UTF-8的开头特征:
   110开头
   10开头
   110开头
   10开头
   这四段的二进制码横着连起来,用GBK来解结果就是"联通",如果用UTF-8来解,结果就未知了!
*/
class UnicomDemo
{
        public static void main(String[] args) throws Exception
        {
                        String str ="联通";

                        byte[] by = str.getBytes("GBK");
                       
                        for(byte b :by)
                    {
                                //使用String的getBytes()方法,将“联通”转为4个字节的表示:
                                System.out.println(b);
                                //得到二进制码:
                                System.out.println(Integer.toBinaryString(b&255));

                        }                               
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2