A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张明星 中级黑马   /  2012-3-28 10:20  /  1836 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

新建记事本之后,输入联通,关闭打开后是4个字节的乱码;但是把乱码删掉,重新输入联通,关闭打开后却是9个字节的联通,不再是乱码!同一个文件,两次输入联通,得到的结果却不同,这是为什么??

3 个回复

倒序浏览
本帖最后由 鲍亚坤 于 2012-3-28 10:39 编辑

在简体中文操作系统中默认的本地字符集编码是GBK编码,除非你在保存记事本文本文件时候选择了其他编码方式,否则用记事本录入的字符信息将使用GBK编码进行储存。巧合的是,“联通”这两个字符的GBK编码具有UTF-8编码的特征,记事本犯下的错误正是将GBK编码存放的记录有“联通”两个字符的文件误认为UTF-8编码的文件。
  对于中文字符,UTF-8编码要用三个字节进行编码,因此,如果你使用记事本录入“联通”,然后选择以UTF-8编码方式保存的话,文件大小应为9个字节(包含三个字节的开头数据),而同样的文件GBK编码却是4个字节。
回复 使用道具 举报
因为联通 适应能力强 谁都能编译成 计算机识别码    联通就是一个 传说中的管死不管埋  的 一个受害者
回复 使用道具 举报
/*
    是记事本解码的问题。当用记事本存入”联通“二字时,记事本会用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));

                        }                               
        }
}

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马