java 字节 字符

字节:byte=8bit 字节是给计算机用的
字符:character(一般2byte) 字符是给人看的
字节是字符的基础,底层传输使用都是字节,上层展示是在字节的基础上根据字符集规则进行编码

ascii码:1byte 对应 1char
unicode:一种规则集合,集合中utf-8,utf16,utf32等
utf-8:一个/多个 byte 对应 1char,前面256个char都是一个字节跟ascii码一致,所以ascii是一种特殊的utf8
utf16:两个 byte 对应 1char,ascii码中每个字符也是用2byte标识,前面补0
utf32:

中文:中文汉字超过10万个,所以2的16次方即65536都不够
目前采集的标准是gb18030,一个/两个/四个 对应 1char
big5

java在读写文件的时候一种是字节流,一种是字符流,其中字符流=字节流+编码方式
字节流:inputstream,outputstream
字符流:inputstreamreader(inputstream+charset+reader),outputstreamwriter(outputstream+charset+writer)

java string
程序在编码的时候,有默认的字符编码
eg:String str=“我是中文” (UTF8编码)
如果指定的是UTF8,那么转化成字节的值 byte []chars=s.getbytes(“UTF-8”) 12bytes
如果指定GBK,那么转化成字节的值 byte []chars=s.getbytes(“GBK”) 8bytes
也就是我们平时的string称之为字符串,跟字符编码是息息相关的

读写文件:
文件一般是用来给人阅读或者编辑的,所以一般文件都是做了编码之后保存的,那么在读取的时候,一定要根据编码进行读写,编码不一致的问题,假设文件本身是utf8的,读取用gbk,这时候可能会把本身是一个整体的字符拆成了两个字符从而改变了它的含义,如果只读不做中间处理,然后写的时候用的还是相同编码,那么中间编码无所谓,这时候用字节流读取最合适。

文件转化:
比喻说excel转化csv,excel保存起来的时候是有编码的,解析成csv的时候,我们可以按照字节流读取,因为我们不需要知道它长什么样也不需要做中间处理,只需要按照流的方式从非文本文件读出来然后写进文本文件,读取过程是字节流,但是写入的时候必须是字符流,因为要做字符识别,这时候就需要让excel的编码跟写入文本文件的编码一致,不然会乱码。

其实文件保存的是字节流(传输,保存都是字节流,使用是字符流),然后文本文件按照编码方式编码之后展示出来,在内存中,我们主要是用字符流做判断,比喻判断两个汉字是否相同。

你可能感兴趣的:(java,乱码,java,字节流,字符流,编码)