java 是如何编码解码的.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
java 是如何编码解码的.pdf

j ava 是如何编码解码的 j ava是如何编码解码的 在上篇博客中LZ 阐述了j ava各个渠道转码的过程,阐述了j ava在运⾏过程中那些步骤 在进⾏转码,在这些转码过程中如果⼀处 现问题就很有可能会产⽣乱码 !下⾯LZ就 讲述j ava在转码过程中是如何来进⾏编码和解码操作的。 编码解码 在上篇博客中LZ 阐述了三个渠道的编码转换过程,下⾯LZ将结束j ava在那些场合需要 进⾏编码和解码操作,并详序中间的过程,进⼀步掌握j ava的编码和解码过程。在j ava 中主要有四个场景需要进⾏编码解码操作: 1 :I/O操作 2 :内存 3 :数据库 4 :j avaWeb 下⾯主要介绍前⾯两种场景,数据库部分只要设置正确编码格式就不会有什么问题, j avaWeb场景过多需要了解URL 、get 、POST的编码,servlet的解码,所以j avaWeb场 景下节LZ介绍。 I/O操作 在前⾯LZ就提过乱码问题⽆⾮就是转码过程中编码格式的不统⼀产⽣的,⽐如编码时 采⽤UTF-8 ,解码采⽤GBK ,但最根本的原因是字符到字节或者字节到字符的转换 问题了,⽽这中情况的转换最主要的场景就是I/O操作的时候。当然I/O操作主要包括 ⽹络I/O (也就是j avaWeb )和磁盘I/O 。⽹络I/O下节介绍。 ⾸先我们先看I/O的编码操作。 I putStream为字节输⼊流的所有类的超类,Reader为读取字符流的抽象类。j ava读取 ⽂件的⽅式分为按字节流读取和按字符流读取,其中I putStream 、Reader是这两种读 取⽅式的超类。 按字节 我们⼀般都是使⽤I putStream .read()⽅法在数据流中读取字节 (read()每次都只读取⼀ 个字节,效率⾮常慢,我们⼀般都是使⽤read(byte[]) ),然后保存在⼀个byte[]数组 中,最后转换为Stri g 。在我们读取⽂件时,读取字节的编码取决于⽂件所使⽤的编 码格式,⽽在转换为Stri g过程中也会涉及到编码的问题,如果两者之间的编码格式 不同可能会 现问题。例如存在⼀个问题test .txt编码格式为UTF-8 ,那么通过字节流 读取⽂件时所获得的数据流编码格式就是UTF-8 ,⽽我们在转化成Stri g过程中如果不 指定编码格式,则默认使⽤系统编码格式 (GBK )来解码操作,由于两者编码格式不 ⼀致,那么在构造Stri g过程肯定会产⽣乱码,如下: File file = new File(C:\\test.txt); InputStream input = new FileInputStream(file); StringBuffer buffer = new StringBuffer(); byte ] bytes = new byte 1024]; for(int n ; (n = input.read(bytes))!=-1 ; ){ buffer.append(new String(bytes,0,n)); } System.out.println(buffer); 输 结果:锘挎垜鏄?cm test .txt 中的内容为:我是 cm 。 要想不 现乱码,在构造Stri g过程中指定编码格式,使得编码解码时两者编码格式 保持⼀致即可: buffer.append(new String(bytes,0,n,UTF-8)); 按字符 其实字符流可以看做是⼀种包装流,它的底层还是采⽤字节流来读取字节,然后它使 ⽤指定的编码⽅式将读取字节解码为字符。在j ava 中Reader是读取字符流的超类。所 以从底层上来看按字节读取⽂件和按字符读取没什么区别。在读取的时候字符读取每 次是读取留个字节,字节流每次读取⼀个字节。 字节字符转换 字节转换为字符⼀定少不了I putStreamReader 。API解释如下:I putStreamReader 是 字节流通向字符流的桥梁:它使⽤指定的 charset 读取字节并将其解码为字符。它使⽤ 的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 每次调⽤ I putStreamReader 中的⼀个 read() ⽅法都会导致从底层输⼊流读取⼀个或多

文档评论(0)

tangtianbao1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档