- 浏览: 39122 次
- 性别:
- 来自: 唐山
文章分类
最新评论
现代计算机采用的都是冯.诺依曼体系结构,因此都具有相同的结构特征,拥有五大组成部分:输入数据和程序的输入设备,记忆程序和数据的存储器,完成数据加工处理的运算器,控制程序执行的控制器,输出处理结果的输出设备。JVM是一台虚拟的计算机,也有类似的特征。本系列文章研究的是java中文问题,跟输入输出有着密切的联系,为了突出重点,我们暂且将JVM的其它细节放下,只需了解JVM内部的数据是用Unicode表示的,使用的编码方式是UTF-16(至于是UTF-16LE还是UTF-16BE就要看具体的虚拟机实现了,intel x86 -windows 下是UTF-16LE,这可以使用 System.getProperty("sun.io.unicode.encoding") 取得)。
现在我们具体来看运行一个控制台程序所经历的步骤以及这个过程中涉及到输入和输出。一个程序从源代码到运行大概会经历这么一个过程:
1、使用一个文本编辑器编写java源代码,完毕后保存到一个.java文件中。如果指定文件的保存格式(GBK,UTF-8 ect.),则用指定的格式保存,否则使用默认编码方式保存(记事本,Editplus,eclipse等都是使用系统默认的编码方式GBK)。
2、使用javac命令编译.java源文件,产生.class文件,以UTF-8格式保存。注意,.class文件的格式必须是UTF-8,不需要指定,也不管系统默认的编码方式是什么。
3、使用java程序,运行jvm,载入编译好的.class文件,程序开始运行。
4、运行过程中,程序从输入(标准输入,文件,网络)中取得数据,进行相应的编码转换后放进JVM,以供运算使用。运算完毕后,将产生的数据进行编码转换后输出到指定位置(标准输出,文件,网络)
这样,程序就一直运行下去,直到结束。这期间,哪些地方有可能出现中文问题呢?下面一一道来:
1、使用javac进行编译时。如果我们.java源文件保存的编码方式跟javac指定的读入编码方式不一致,则会出现中文问题。譬如,我们在中文windows环境下用eclipse编写好源文件,然后到一个英文linux环境下进行编译,如果javac时没有指定编码方式为GBK,那么javac就会按照当前系统的默认编码方式(ISO-8859-1)进行解析,虽然里面的英文字符是不会出错的,但是中文就全部变成乱码了,也就是说,javac产生的.class文件中存储的中文字符是错误的。这样,运行的时候肯定也就出问题了。
建议 1 :保存.java源文件时使用UTF-8进行保存,在使用javac编译的时候通过参数 -encoding UTF-8指定编码方式。这样,可以保证源程序在任何支持UTF-8的平台上都能通过编译。PS:通过记事本的另存为将一个源文件保存成UTF-8时,会在文件头部加上一个BOM(ef bb bf),javac会报错。但是用Editplus,eclipse却不会出现这种问题。
2、控制台跟操作系统密切相关,标准输入输出的编码都是固定的,也就是系统的默认编码,这是不能动态改变的。如果你程序里有中文编码,在中文环境下调用System.out.println("汉"); jvm会自动将输出流转换为GBK字节串交给控制台,控制台使用默认编码就正确输出了。但是该语句在英文环境下运行的话,那里的默认编码是ISO-8859-1,jvm就将“汉”转换成相应编码交给控制台,也就是两个“?”了。
建议 2:如果程序要跨平台的话,程序里用到控制台输出的代码最好不用中文字符。
3、如果数据来自网络或者文件的话,数据源的编码方式可以多种多样。因此,我们在读入的时候一定要清楚数据源的编码方式,通知jvm进行正确的处理,否则也会出现中文问题。下面以文件读写为例。
java 中处理字符的读写一般使用FileReader和FileWriter。但是这两个类都是使用系统默认的字符编码进行文件的读写,而且不能更改处理时的编码方式。也就是说,在GBK平台只能处理GBK的文件,在ISO-8859-1的平台只能处理ISO-8859-1的文件,这当然是不能接受的。因此,使用InputStreamReader 和 OutputStreamWriter吧。只要你能保证数据源的编码方式,然后读写时配置好相应的读写器的编码方式,就不会出现中文问题了。
建议 3 :使用文件进行数据交换时,最好统一文件的编码方式,如UTF-8。虽然对于中文来说,体积会增大50%,但是换来的是很好的跨平台特性。xml就是一个很好的例子。
如果能很好地做到上面几条,那么对于一个控制台应用程序来说应该是可以避免中文问题了。
PS:为了更好理解,转自他处的资料:
编码方式的简介:
String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。
GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。
UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。 用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。
UNICODE值 UTF-8编码
原文地址 http://blog.csdn.net/regon/archive/2006/09/21/1258942.aspx
现在我们具体来看运行一个控制台程序所经历的步骤以及这个过程中涉及到输入和输出。一个程序从源代码到运行大概会经历这么一个过程:
1、使用一个文本编辑器编写java源代码,完毕后保存到一个.java文件中。如果指定文件的保存格式(GBK,UTF-8 ect.),则用指定的格式保存,否则使用默认编码方式保存(记事本,Editplus,eclipse等都是使用系统默认的编码方式GBK)。
2、使用javac命令编译.java源文件,产生.class文件,以UTF-8格式保存。注意,.class文件的格式必须是UTF-8,不需要指定,也不管系统默认的编码方式是什么。
3、使用java程序,运行jvm,载入编译好的.class文件,程序开始运行。
4、运行过程中,程序从输入(标准输入,文件,网络)中取得数据,进行相应的编码转换后放进JVM,以供运算使用。运算完毕后,将产生的数据进行编码转换后输出到指定位置(标准输出,文件,网络)
这样,程序就一直运行下去,直到结束。这期间,哪些地方有可能出现中文问题呢?下面一一道来:
1、使用javac进行编译时。如果我们.java源文件保存的编码方式跟javac指定的读入编码方式不一致,则会出现中文问题。譬如,我们在中文windows环境下用eclipse编写好源文件,然后到一个英文linux环境下进行编译,如果javac时没有指定编码方式为GBK,那么javac就会按照当前系统的默认编码方式(ISO-8859-1)进行解析,虽然里面的英文字符是不会出错的,但是中文就全部变成乱码了,也就是说,javac产生的.class文件中存储的中文字符是错误的。这样,运行的时候肯定也就出问题了。
建议 1 :保存.java源文件时使用UTF-8进行保存,在使用javac编译的时候通过参数 -encoding UTF-8指定编码方式。这样,可以保证源程序在任何支持UTF-8的平台上都能通过编译。PS:通过记事本的另存为将一个源文件保存成UTF-8时,会在文件头部加上一个BOM(ef bb bf),javac会报错。但是用Editplus,eclipse却不会出现这种问题。
2、控制台跟操作系统密切相关,标准输入输出的编码都是固定的,也就是系统的默认编码,这是不能动态改变的。如果你程序里有中文编码,在中文环境下调用System.out.println("汉"); jvm会自动将输出流转换为GBK字节串交给控制台,控制台使用默认编码就正确输出了。但是该语句在英文环境下运行的话,那里的默认编码是ISO-8859-1,jvm就将“汉”转换成相应编码交给控制台,也就是两个“?”了。
建议 2:如果程序要跨平台的话,程序里用到控制台输出的代码最好不用中文字符。
3、如果数据来自网络或者文件的话,数据源的编码方式可以多种多样。因此,我们在读入的时候一定要清楚数据源的编码方式,通知jvm进行正确的处理,否则也会出现中文问题。下面以文件读写为例。
java 中处理字符的读写一般使用FileReader和FileWriter。但是这两个类都是使用系统默认的字符编码进行文件的读写,而且不能更改处理时的编码方式。也就是说,在GBK平台只能处理GBK的文件,在ISO-8859-1的平台只能处理ISO-8859-1的文件,这当然是不能接受的。因此,使用InputStreamReader 和 OutputStreamWriter吧。只要你能保证数据源的编码方式,然后读写时配置好相应的读写器的编码方式,就不会出现中文问题了。
建议 3 :使用文件进行数据交换时,最好统一文件的编码方式,如UTF-8。虽然对于中文来说,体积会增大50%,但是换来的是很好的跨平台特性。xml就是一个很好的例子。
如果能很好地做到上面几条,那么对于一个控制台应用程序来说应该是可以避免中文问题了。
PS:为了更好理解,转自他处的资料:
编码方式的简介:
String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。
GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。
UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。 用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。
UNICODE值 UTF-8编码
原文地址 http://blog.csdn.net/regon/archive/2006/09/21/1258942.aspx
发表评论
-
Tomcat热部署原理
2012-05-19 20:49 1198一. ... -
java 并发实践
2012-03-23 11:02 0java并发编程实践笔记 1, 保证线程安全的三种方法: ... -
Map sort
2010-12-02 11:09 1812可能会遇到这样的情况,我可能要对Map<key,valu ... -
Java 解析 xml
2010-07-20 10:59 6941.介绍 1)DOM(JAXP Crimson解析器 ... -
Class文件格式解析
2010-07-01 21:40 889http://www.blogjava.net/javafan ... -
java中byte转换int时为何与0xff进行与运算
2010-07-01 21:29 908[转]java中byte转换int时为何与0xff进行与运算 ... -
java 的InputStream和OutputStream的理解
2010-06-21 15:10 1913(转)java 的InputStream和OutputStre ... -
Think in java
2010-04-19 13:26 1008一、第一章 对象导论 1、Alan Kay总结了面向对象的五 ... -
java-email(转)
2010-03-23 15:50 926最近在项目中用到发送 ... -
UNICODE与 UTF-8的转换详解
2010-03-19 10:18 4802转载请注明出处: http://www.ins1000.cn/ ... -
java中hashcode()和 equals()的详解[转]
2010-03-18 14:34 714java中hashcode()和 equals() ... -
细说java的util中的集合类
2010-03-03 14:54 728线性表,链表,哈希表是常用的数据结构,在进行Java开发时,J ... -
String 创建
2010-03-01 10:52 774package com; import org.junit.T ... -
java字符串连接
2010-02-01 17:22 1540注:引用http://www.blogjava.net/nok ... -
java
2010-01-06 16:53 643【转】JNDI的详细介绍(09-03-27) 收藏 看到这篇关 ...
相关推荐
阿里巴巴java编码规范 ,Java 并发编程培训(阿里巴巴) 《阿里巴巴Java开发手册》,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大...
华为JAVA编码规范.pdf 华为JAVA编码规范.pdf是华为公司编写的JAVA编程语言编码规范,旨在提供一个统一的编程风格和代码组织方式,以提高代码的可读性、维护性和可重用性。该规范涵盖了编程语言的基本结构、命名规则...
腾讯 Java 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...
Java 编码规范 Java 编码规范是指在 Java 语言中编写代码时需要遵守的一些约定和规则,以确保代码的可读性、可维护性和可扩展性。本文将对 Java 编码规范的主要内容进行详细讲解。 命名风格是 Java 编码规范的重要...
《阿里巴巴 Java 编码指南》是业界广泛采用的编码规范,旨在提高代码质量和开发效率,尤其对于使用 IntelliJ IDEA 的开发者来说,此指南的兼容性更新至 2023.3+ 版本,确保了最新的开发环境支持。这份指南在 2024 年...
Java编码规范是软件开发中非常重要的一个环节,它旨在提高代码质量、可读性、可维护性和团队协作效率。这份文档,"Java编码规范.doc",由东软集团有限公司的商用软件事业部编写,包含了国内大型Java项目和国际知名...
Java编码标准是软件开发中的一项重要规范,它旨在提高代码质量、可读性以及团队间的协作效率。这份PDF文档很可能是Oracle公司或者一些知名的Java社区制定的编程规范,旨在为Java开发者提供一套统一的编码指南。以下...
【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...
**百度Java编码规范** 在软件开发中,遵循一定的编码规范是非常重要的,它能提高代码的可读性,便于团队协作,降低维护成本。百度作为一家技术驱动的公司,也提出了其内部使用的Java编码规范,旨在确保代码的一致性...
JAVA 编码规范试题 JAVA 编码规范试题是一套涵盖了 JAVA 编程规范的试题,旨在帮助开发者掌握 JAVA 编程的基本规范和best practice。该试题涵盖了 JAVA 编程规范的多个方面,包括变量命名、代码格式、异常处理、...
本文将深入探讨“js解码”和“java编码”这两个主题,并结合标签“源码”和“工具”,讨论如何在实际项目中应用它们。 首先,我们来看JavaScript中的解码。JavaScript是一种在客户端和服务器端都能运行的脚本语言,...
Java 编码规范是开发团队遵循的一套标准,旨在提高代码质量、可读性和可维护性。这份规范涵盖了多个方面,包括文件命名、命名规范、Java 文件样式、代码编写格式以及编程技巧和性能优化等。 1. **前言** - 简介:...
Java编码规范(Java Coding Standard) oiNSFT-BS-OT0105 V3.0 2005-5-11 东软集团有限公司 商用软件事业部 版权所有 中国 沈阳浑南高新技术产业开发区 东软软件园
JAVA编码规范培训
"java编码规范(华为)" Java编码规范是华为公司为Java语言编程提供的规范性文档,旨在提高编程的规范化和专业化。本规范涵盖了Java语言编程的各个方面,包括排版、注释、命名、编码和JTEST规则和建议。 1. 范围 ...
java编码规范,非常详细 每个switch-case语句都有最后一个default以确保处理了全集。switch中,每一条case分支必须使用break语句结束