JAVA and JAVA WEB with TOMCAT and ECLIPSE 学习过程中遇到的字符乱码问题及解决方法汇总(随时补充)

JAVA语言具有跨平台,unicode字符集编码的特点。

但是在开发过程中处理数据时涉及到的字符编码问题零零散散,尤其是处理中文字符时一不留神就可能出现一堆奇奇怪怪的符号,俗称乱码。

对于乱码,究其原因,就是因为编码和解码过程中使用了错误的字符编码方案导致的。



首先在开头说明本人对 编码 解码 这两个概念的理解(如有错误烦请dalao指出,如有疑问也欢迎交流,感激不尽!):

首先,有一个字符串:

String str="hello,编码";

使用String类的方法getBytes(String charset);指定一个字符编码方案由字符串str其ByteArray形式,称之为为编码过程:

byte[] b_str = str.getBytes("utf-8");

使用String类重载的构造方法之一String(byte[] b,String charset);指定一个字符编码方案从一个ByteArray生成一个字符串,称之为解码过程:

String str_b = new String(b_str, "utf-8");

类似的,在某些在字节流与字符流之间进行转换工作的类及方法也都如此理解,即:

字符→字节:编码

字节→字符:解码



对于java源文件编码的说明:

在编写java源文件时,可能使用了各种编码,只要在编译时通过编译参数指定使用的编码方案即可

-encoding 字符集

无论是.java还是.jsp,涉及java源码的地方,都需要告知编译器使用哪种字符编码方案来处理该源码。

现在这一工作大多已经由各种集成开发环境代为完成了,但我们仍需对其有一定了解以备不时之需。



对于java程序中的编码:

在一个java程序中,涉及到编码问题地方集中在文件读写,各种输入输出流的使用上,本小节着重分析java程序运行时的编码问题。

在对存储内容为字符的文件进行读写的时候,多数情况下是使用了包装类对文件输入输出流进行了包装。

这些字符读写包装类表面上没有涉及编码问题,实际上包装类产生的字符流在调用底层字节流的时候也是需要将数据在字符-字节间进行相应转换的,只不过默认情况下其采用了平台默认字符编码方案来完成编码-解码过程。

当我们有特殊需要的时候,可以主动控制这一过程,让包装类使用我们指定的字符编码方案进行字符-字节的转换。

此处以,字符流(输出字符的包装类PrintWriter,缓冲读取字符的包装类BufferedReader),底层流(文件IO流)为例:

我们利用在包装类使用Writer或Reader作为参数的构造方法,使用InputStreamReader和OutputStreamWriter两个中间类来指定字符-字节转换使用的字符编码方案

try {
	File f = new File("d:\\coding.txt");
	FileOutputStream fos = new FileOutputStream(f);
	FileInputStream fis = new FileInputStream(f);
	PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos, "utf-8"));
	BufferedReader br = new BufferedReader(new InputStreamReader(fis, "utf-8"));
} catch (Exception e) {
	e.printStackTrace();
}

通过上述代码,我们就实现了使用包装类且使用我们指定的字符编码方案更便捷的进行字符操作。

对于其他的包装的方法与此相同的以字节为基础的流,此处不再赘述。

有一点值得注意:不同的字符编码方案在错误的解码之后可能会丢失字节。

例如奇数个中文字符以UTF-8编码后以GBK解码再编码后再以UTF-8解码导致部分乱码:

try {
	String str = "哈哈哈";
	byte[] encode_by_utf8 = str.getBytes("utf-8");
	String decode_by_gbk = new String(encode_by_utf8, "gbk");
	byte[] encode_by_gbk = decode_by_gbk.getBytes("gbk");
	String decode_by_utf8 = new String(encode_by_gbk, "utf-8");
	System.out.println(decode_by_utf8);	//Output:哈哈??
} catch (Exception e) {
	e.printStackTrace();
}

简述其根本原因:两种编码方案对单个中文字符编码时使用的字节数不同导致中间过程中丢失了字节,虽然总体上编码还原了但是边界丢失的字节导致了乱码。

更详细的分析见此文章:http://blog.csdn.net/beyondlpf/article/details/7519786



吃饭去了,回来继续写

原文地址:https://www.cnblogs.com/Mimick/p/8287507.html

时间: 2024-10-13 02:43:36

JAVA and JAVA WEB with TOMCAT and ECLIPSE 学习过程中遇到的字符乱码问题及解决方法汇总(随时补充)的相关文章

Java web应用中的常见字符编码问题的解决方法

以下是 Java Web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Content-Type: text/html; charset=UTF-8, 页面使用的就UTF-8编码. 但是考虑到离线的html(用户可能把页面html保存到本地), 打开离线的html的时候就要在meta指定编码,当然不指定也会有default值,那么不指定有时就可能出现乱码. Meta标签 <

java中文乱码解决方法汇总

publicstaticvoidmain(String[]argv){ try{ System.out.println("中文");//1 System.out.println("中文".getBytes());//2 System.out.println("中文".getBytes("GB2312″));//3 System.out.println("中文".getBytes("ISO8859_1″));

java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序解决方法

开发程序需要登录功能 ,就不想用大数据库,直接用java连接access.     在自己机器上一切正常,  url直连 和配置数据源都没有问题.  发布到windows server2008 上 ,获取不到数据连接.      系统都是64位, office是2010  32位.     问题找了半天,最终得以解决: 32为的Access driver 需要用32为的jdk才能调用, 于是重装成与自己机器上一样的32位jdk,  连接成功,问题解决.      配置数据源不会刻意搜一下. ja

Ubuntu系统下运行Eclipse出现找不到jre的问题的解决方法

在Ubuntu的某些版本下,比如10.10,会出现以下奇怪问题:1. 安装jdk我下载的jdk是bin格式的,直接运行解压,得到一个文件夹.这个文件夹作为jdk的安装目录,可以拷贝到任意目录.然后配置环境变量~/.bashrc,在最后添加:export JAVA_HOME=<jdk install dir>export JRE_HOME=$JAVA_HOME/jreexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH重启机器.2. 安装eclipse直接

eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn&#39;t work)

在eclipse中用过maven的可能都遇到过这种情况,我以前一直在search.maven里面搜索,然后添加pom信息. 今天在网上搜索时,找到了一个解决方法,在这里分享一下. 第一步,在preferences里面选择maven,选中"Download repository index updates on startup" 第二步,打开Maven仓库 第三步,在全局仓库上右键选择"Full Index Enabled" 选择之后,maven会下载一个近百兆的索引

java.lang.IllegalStateException:Web app root system property already set to different value 错误原因及解决 Log4j

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口 服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 其实呢,我觉得他就是一个能对我们的WEB应用监控的组件,让我们可以了解到我们的程序运行的情况 ,以及出错后

错误/异常:java.io.FileNotFoundException: .\src\db.properties (系统找不到指定的路径。);的解决方法

1.异常视图 2.解决方法 与之相关的部分代码: 1 static{ 2 try { 3 //读取db.properties 4 Properties props = new Properties(); 5 FileInputStream in = new FileInputStream("./src/db.properties"); 6 //加载文件 7 props.load(in); 8 url = props.getProperty("url"); 9 use

Java调用https服务报错unable to find valid certification path to requested target的解决方法

我们网站要进行https改造,配置上购买的SSL证书后,浏览器访问正常,但是写了个java代码用httpcomponents调用https rest接口时报错: Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath

Java读properties文件中文乱码问题的解决方法

java读properties文件,包含中文字符的主要有两种: 1.key中包含中文字符的(value中也有可能包含) 2.key中不包含中文字符的(value中有可能包含) 1.key中包含中文字符 可以使用java自带工具native2ascii.exe(Java\jdk1.x.x\bin\native2ascii.exe),转换文件编码格式 示例: native2ascii -encoding 8859_1 c:\a.properties c:\b.properties 即将 c:\a.p