下面解释一下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编码方式全程跟进”旨在全面讲解Java的编码规范、常见问题及解决策略,帮助开发者提高代码质量和可维护性。下面将详细阐述Java编码方式中的关键知识点。 1. **Java字符编码**:Java默认使用Unicode编码...
在Java编程语言中,判断文件或字符串的编码方式是一个常见的需求。这主要涉及到字符集的概念,如ASCII、ISO-8859-1、UTF-8等,它们用于将二进制数据转换为人类可读的字符。在Java中,有多种方法可以用来识别或检测一...
Java 编码规范 Java 编码规范是指在 Java 语言中编写代码时需要遵守的一些约定和规则,以确保代码的可读性、可维护性和可扩展性。本文将对 Java 编码规范的主要内容进行详细讲解。 命名风格是 Java 编码规范的重要...
华为JAVA编码规范.pdf是华为公司编写的JAVA编程语言编码规范,旨在提供一个统一的编程风格和代码组织方式,以提高代码的可读性、维护性和可重用性。该规范涵盖了编程语言的基本结构、命名规则、代码组织、注释、编程...
Java编码是程序开发的核心环节,主要涉及Java语言的语法、编程规范、最佳实践以及相关工具的使用。在Java编程中,我们遵循一定的规则和标准,以确保代码的可读性、可维护性和高效性。以下是对Java编码相关知识点的...
【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...
在Java编程语言中,处理文本数据离不开对编码方式的理解。编码是将字符转换为计算机可以处理的二进制形式的过程。Unicode是一种国际标准编码方式,旨在为世界上所有的文字提供一个唯一的数字标识。以下是对Java中...
在Java编程中,处理不同编码方式的字符串转换是一项常见的任务,尤其在处理来自不同系统或网络的数据时。本文将深入探讨如何使用Java实现这一过程,同时涵盖异常处理、重复不终止输入以及`BufferedReader`的高效使用...
本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891
总之,Java中的TLV编码和解码涉及到数据结构的表示和转换,熟悉这种编码方式对于理解和处理通信协议、序列化数据等方面都有很大帮助。结合`ber-tlv`资源,开发者可以快速地在Java项目中实现自己的TLV处理功能。
Java编码标准是软件开发中的一项重要规范,它旨在提高代码质量、可读性以及团队间的协作效率。这份PDF文档很可能是Oracle公司或者一些知名的Java社区制定的编程规范,旨在为Java开发者提供一套统一的编码指南。以下...
在 Java Web 开发中,设置 Response 的编码方式是非常重要的,因为它直接影响到浏览器对服务器响应的解析和显示。下面我们将详细讨论 Response 设置编码的三个方法,并分析它们之间的差异。 response.setCharacter...
### 如何改变MyEclipse默认编码方式 在开发过程中,正确地设置文本文件的编码方式是非常重要的,这能避免因编码不一致导致的各种乱码问题。对于使用MyEclipse进行Java开发的用户来说,了解如何修改项目的编码设置是...
在Java编程中,正确识别和处理文件的编码方式至关重要,特别是在处理不同系统间的数据交换或者解析非ASCII字符的文本文件时。本篇文章将详细介绍两种常用的方法来检测Java程序中的文件编码:一是使用`cpdetector`第...
其中,Base64是一种常用的编码方式,用于将二进制数据转换为ASCII字符串,以便在网络上传输。在给定的`Base64.js`文件中,很可能包含了用于Base64编码和解码的函数或类。Base64解码通常用于处理例如图片、音频等二...
在IT行业中,编码方式是构建网络通信和存储数据的基础,特别是在处理URL(统一资源定位符)和文件时。本文将深入解析URL和文件的编码方式,以帮助理解这些概念及其在实际工作中的应用。 首先,URL是互联网上访问...
本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言进行示例,同时引入第三方库来辅助处理编码问题。 首先,创建CSV文件的基本过程涉及将数据写入具有特定分隔...
### Java编码规范详解 #### 一、为什么要制定编码规范? 代码规范对于软件开发的重要性不容忽视。良好的代码风格不仅能提升代码的可读性,还能增强代码的健壮性,并减少因修改代码而引入错误的可能性。特别是在...
"Java编码规范及实践"是一个专注于指导Java程序员如何编写清晰、可读、可维护代码的指南。这份资料旨在帮助开发者养成良好的编程习惯,降低代码的复杂性和错误率,提升整体项目质量。 1. **命名规范** - 类名:...
Java 安全编码 Java 安全编码是 Java 开发语言中的一项重要考虑因素。Java 安全编码的主要目标是保护 Web 应用程序免受各种攻击和漏洞的影响。下面是 Java 安全编码的详细知识点: 1. SQL 注入攻击 SQL 注入攻击...