黑马程序员技术交流社区

标题: char的读取和存储 [打印本页]

作者: 许冉    时间: 2011-10-11 15:04
标题: char的读取和存储
一个char占两个字节
1,从键盘输入一个字符,它是几个字节的
     读取键盘录入时,可以用read方法读取一个字符,可是read读取的是一个字节啊,
2,如果把读取的几个字符存到byte数组中或char数组中,有什么区别
3,当我们定义一个char时,是两个字节吧
     把一个char放在byte数组中,是不是只放进去一个字节啊
一会两个字节,一会一个字节都弄乱了,懂的给讲讲细节


作者: 庞金梁    时间: 2011-10-11 16:03
要搞清楚 code point 和 encoding 的区别。Java 是遵循 unicode 4.0 标准的,而内部的 character 以 utf-16 作为 encoding。unicode 4.0 标准包含从 U+0000-U+FFFF 的基本多语言平面和 U+10000-U+10FFFF 的扩展平面的文字,这是 code point。Java 的 char 类型是 16 bit 的,所以单个 char 只支持基本平面内的文字,而扩展平面的文字是由一对 char 来表示的。
而 String.getBytes() 这个方法是按照指定的 encoding 返回字符串,一般中文系统的默认编码是 utf-8 (linux, mac) 或者 gbk/gb18030 (windows)。只要是基本平面内的文字,utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的。
哦,我只是一个搬运工,
作者: 许冉    时间: 2011-10-12 14:35
庞金梁 发表于 2011-10-11 16:03
要搞清楚 code point 和 encoding 的区别。Java 是遵循 unicode 4.0 标准的,而内部的 character 以 utf-16 ...

貌似编码的问题很难看懂
作者: 苏志伟    时间: 2011-10-13 15:38
二楼,说的好犀利....密密麻麻,呵呵!
         我说的饿通俗一点把:这个read,楼主你指的是字符流的read,还是字节流的read啊!
        【拓展:】 还有需要了解的是编码问题,我们系统默认的gbk编码,这个编码的特点就是,英文,字符,占一个字节,汉字占两个字节, 其在二进制中的表现形式是有区别的,汉字的开头,貌似,好像,是-1开头。字母好像是0开头的。我记忆中好像是这样,您要是想深入了解,可以去查查。
         重点的来了啊!!!
         字节流:(InputStream)的read方法一次性读取的是一个字节,管它是汉字,英文。
         字符流:(Reader)的read方法是一次性读取一个字符,其到底一次读取一个字节,还是两个字节,就是看内存中的二进制代码的特征,要是开头是-1就一次性读取两个字节反之就读取一个字节。

        上边的是读得方法,
        下边的是写的方法。(涉及到乱码的问题。)
         当我们输出的时候,系统默认的是gbk的所以它也会自动判断,将二进制转换为相应的字符。这个时候我们也可以指定字符的编码集。
          为什么有时候会乱码呢!原因就是,我们在读取文件的时候是按照gbk的读进来,然后我们写出去的时候又按照utf的格式写出去,这样就产生乱码了!

         建议:多多研究IO流中字符字符编码转换的文档,了解其内部原理。




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