下面解释一下Java的编码方式,知道了编码方式则乱码将很容易解决。
1:java中byte是以补码表示:http://www.blogjava.net/orangelizq/archive/2008/07/20/216228.html
2 : IO流操作的基本单元
观看io里面stream的操作,最终有两种:write(int b),write(byte[] bs),读的方式也一样。 其余的均是在这两种方式上进行封装处理。
由此也能看到文件操作的基本单元bit,而Java的基本单元是字节(byte),一个字节8个bit,字节能表示的范围为[0,255]。而java里面的byte类型的范围是[-128,127],这点必须区分开。
因此对write(b), write(byte[] bs) 的理解应该以bit的方式去理解,不能以Java中的byte类型去理解。
OutputStream.write(int b)是将一个字节写入到流中,而不是将int写入流中,即将int所表示的低8位bit写入,高24bit舍去。因此通过write(int b)将一个byte类型的b写入时不会有问题的:
byte b = (byte)-1;out.write(b); 该转化过程为: btye -> int -> 截取低8位,写入流中。 中间byte->int得到的int的bit序列可能有误,具体请看:http://www.blogjava.net/orangelizq/archive/2008/07/20/216228.html, 但由于最后截取低8位bit,所以最后得到的bit都是正确的。
同样可以推理出int i = read() 和 byte b =(byte)read(); 由此我们可以看到读写进行的bit处理都是一致的。
使用IO的这些接口时,不用考虑是int 还是byte类型,直接调用即可。
3: byte,unicode, 编码方式(比如UTF8)之间的关系
unicode 和utf8的关系: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
Java编码的基本概念:Java采用的编码:unicode,JVM平台默认字符集和外部资源的编码
请参阅: http://www.iteye.com/topic/311583
Java中String 是以unicode的方式存储,也就是说一个String的unicode编码是固定的,其unicode表示的byte序列也是固定。
由于存储效率的原因,我们需要使用别的编码方式,比如utf8,那么就需要将unicode的bit序列转化为utf8所表示的bit序列,这要求unicode和utf8之间必须能互相转换。
因此可以得出:对同一个unicode使用不同的编码方式得到的bit序列将是不一样的。
4:乱码的问题:
一般的数据流程:外部输入 -> Java String -> 外部输出。
由于IO处理的byte(8个bit)类型,因此该流程应该为:读取外部介质-> 输入的byte序列 ->JVM的unicode -> 输出的byte序列 -> 写到到外部介质
因此乱码的问题,就会出现在两个地方: 输入的byte序列 -> JVM的Unicode 和 JVM的unicode ->输出byte序列
也就是, 将某中编码的byte序列 转为 unicode 和 将unicode 转化为 某种编码的byte序列。
如果你不知道是哪种编码和unicode进行互转,比如:将UTF8的byte序列使用GBK的编码方式转化为unicode,那么得到unicode byte序列可能不对,则在unicode字符集中找到字符和原来就很可能千差万别了。
另外通过new String(byte[] bs)是不指定编码方式,则默认使用jvm的字符编码进行处理。 因此http://www.iteye.com/topic/311583 指出一定要知道外部系统和JVM的编码方式。
分享到:
相关推荐
自己总结的有关java 编码方式的知识
j a v a 判 断 编 码 方 式,
JAVA编码规范完全教程,内含国内主流大型JAVA项目开发编码详细规范说明,及国际大型公司JAVA编码规范详细说明,及编码的注意事项和因为不规范编码方式而可能产生的代码BUG,本文档是JAVA专业化编程的一把利器。
此文档为Java中编码方式和Unicode知识总结,对了解学习Java编码的讲解很全面清楚!
本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891
做项目时总结的,java程序获取文件编码方式的两种最常用的方式(1.cpdetector第三方jar包,包含源码elipse项目;2.EncodingDetect.java工具类)。
如何用java实现不同编码方式字符串的转换(包含异常处理、重复不终止输入、缓冲区bufferedreader的使用)
的编码习惯除了代码格式,详细的注释外,还应该包括使用有助于提高程序效率的编码方式。 规范的开发有助于提高源码的可读性,可维护性,对于提高项目的整体效率更是不可缺 少的(尤其是团队开发)。 版权所有:沈阳...
如何改变MyEclipse默认编码方式 右键单击项目名称->Properties->Resource->Text file encoding 然后选择自己需要的编码方式,此方法只是改局部的编码方式,如果需要默认设置祥见内容
这是一个DES加密算法,使用的方式是采用Java进行编码
本规范的目的是使本组织能以标准的、规范的方式设计和编码。通过建立编码规范,以使每个开发人员养成良好的编码风格和习惯;并以此形成开发小组编码约定,提高程序的可靠性、可读性、可修改性、可维护性和一致性等,...
读取与创建CSV文件,根据第三方jar包自动解析文件编码方式,相关jar包与使用说明
经常碰到文件编码格式不一致...在FileEncodeTranslate类中,修改一下源文件夹路径,以及转码完成后的文件存放路径、编码方式即可。 可以修改指定文件夹下的多级文件目录中的文件,并且生成的文件夹目录结构不会改变。
用开源的JAR包分析 不多说了 工作中用的比较多
它的类库很小,只有500K左右,利用该类库判定文本文件的代码如下(由于cpdetector的算法使用概率统计,所以结果并不是100%准确的,但是是迄今为止我见过
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码。 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,...
ava支持UTF 8 ISO 8859 1 GBK等各种字体编码 可笔者发现Java中字体编码的问题仍难倒了不少程序员 网上虽然也有不少关于在Java中如何正确显示中文的文章 但都不够全面 笔者特意总结如下 影响Java中字体编码正确显示...
Java高级程序设计 第1章 Java编码规范 1.1 应用场景1.2 相关知识1.3 任务实施1.4 拓展知识1.5 拓展训练1.6课后小结 Java高级程序设计实战教程第一章-Java编码规范全文共13页,当前为第1页。 1.1 应用场景 一个大型的...
idea、Eclipse等项目导入.java文件中文乱码完美解决方案:文件夹下所有GBK编码的.java一键转为utf-8,操作方式:将GBK2UTF8.jar文件考到需要转码项目目录,在当前位置运行控制台,输入命令java -jar GBK2UTF8.jar,...
针对于dp进行训练java的编码方式,共计6个题,让你从dp(动态规划)小白到初步掌握。 里面有对应的题目与题解。 为了帮助大家彻底掌握,题目难度是递进的,可以一点点的掌握,最后当突破六个题目后就可以进行一般题目...