java中文乱码解决方法
在BS模式下写程序,有很多要注意的地方。其中中文编码问题和路径问题是很重要又非常烦人的东西。这段时间由于项目需要从.NET转到java,就遇到了这些问题。经过一段时间的学习,摸索和实践,现整理一下。
项目采用eclipse,走的是大众路线:hibernate+spring+struts。
一,jsp乱码
关于 contentType 和 pageEncoding 的差异 和 中文JSP页的设定技巧:
contentType -- 指定的是JSP页最终 Browser(客户端)所见到的网页内容的编码. 就是 Mozilla的 Character encoding, 或者是 IE6的 encoding. 例如 JSPtw Forum 用的contentType就是 Big5.
pageEncoding -- 指定JSP编写时所用的编码
如果你的是 WIN98, 或 ME 的NOTEPAD记事本编写JSP, 就一定是常用的是Big5 或 gb2312, 如果是用 WIN2k winXP的NOTEPAD时, SAVE时就可以选择不同的编,码, 包括 ANSI(BIG5/GB2312)或 UTF-8 或 UNIONCODE(估是 UCS 16).
因为 JSP要经过 两次的"编码", 第一阶段会用 pageEncoding, 第二阶段会用 utf-8 至utf-8, 第三阶段就是由TOMCAT出来的网页, 用的是contentType.
阶段一是 JSPC的 JSP至JAVA(.java)原码的"翻译", 它会跟据 pageEncoding 的设定读取JSP. 结果是 由指定的 pageEncoding(utf-8,Big5,gb2312)的JSP 翻译成统一的utf-8 JAVA原码(.java). 如果pageEncoding设定错了, 或没设定(预设 ISO8859-1), 出来的 在这个阶段 就已是中文乱码.
阶段二是由 JAVAC的JAVA原码至JAVA BYTECODE的编译. 不论JSP的编写时是用(utf-8,Big5,gb2312),经过阶段一的结果全都是utf-8的ENCODING的JAVA原码. JAVAC用 utf-8的ENCODING读取AVA原码, 编译成字符串是 utf-8 ENCODING的二进制码(.class). 这是 JAVA VIRTUAL MACNHINE对常数字符串在 二进制码(JAVA BYTECODE)内表逹的规范.
阶段三是TOMCAT(或其的application container)加载和执行阶段二得来的JAVA二进制码, 输出的结果( 也就是BROWSER(客户端))见到的. 这时一早隐藏在阶段一和二的参数contentType, 就发挥了功效.
我的解决方法,在每个jsp页面上都做这样处理
1、 在建立JSP页面时应该注意在jsp页面的头部加入一下代码
<!---->
2、 在HTML代码中的中加入这句
二,后台乱码
由上面知道页面使用GB2312编码形式,而在数据库中一般用的是iso-8859-1字符集存储数据. 而Java程序在处理字符时默认采用统一的ISO-8859-1字符集(体现Java国际化思想),所以在添加数据时,默认的字符集编码是iso-8859-1,而页面采用的是GB2312,所以就出现乱码问题。为解决此问题应在存储的时候把GB2312换转成iso-8859-1。有此时候在读出时也会出现乱码,那么只需反过来就可以了,把iso-8859-1转换成GB2312。
我的解决:
1,直接用函数来解决中文乱码的解决方法:
private static final String inCode = "ISO-8859-1";
private static final String outCode = "gb2312";
/**
* 转换字符串编码ISO-8859-1为gb2312
*
到数据库时用readString(String inputString)
* @param inputString 输入字符串
* @return 转换后的字符串
*/
public static String readString(String inputString){
try {
byte[] tempByte = inputString.getBytes(inCode);
inputString = new String(tempByte,outCode);
}
catch (UnsupportedEncodingException ex) {
throw new RuntimeException("Unsupported encoding type.");
}finally{
return inputString;
}
}
/**
* 转换字符串编码gb2312为ISO-8859-1
*
显示的时候用writeString(String inputString)
* @param inputString 输入字符串
* @return 转换后的字符串
*/
public static String writeString(String inputString){
try {
byte[] tempByte = inputString.getBytes(outCode);
inputString = new String(tempByte,inCode);
}
catch (UnsupportedEncodingException ex) {
throw new RuntimeException("Unsupported encoding type.");
}finally{
return inputString;
}
}
2,在调用页面回传值的时候,强行加以转换
1)取出来的时候使用 String str=new String(strName.getBytes(“iso-8859-1”),”GB2312”);
2)在取制值前加上 request.setCharacterEncoding("gb2312");
但在程序中这样写往往就会报“Unhandled exception type UnsupportedEncodingException”错误,可以使用try catch处理一下,问题就解决了。
3,在java程序中都如上面那样处理,如果项目大了,就很不科学了。这时最好是使用过滤器来处理。
具体处理是在web.xml文件中先注册一个服务类。
<filter></filter>
<filter-name></filter-name>Set Character Encoding
<filter-class></filter-class>com.stonecai.service.SetCharacterEncodingFilter
<init-param></init-param>
<param-name></param-name>
encoding
<param-value></param-value>
GBK
<filter-mapping></filter-mapping>
<filter-name></filter-name>Set Character Encoding
<url-pattern></url-pattern>/*
包com.stonecai.service.SetCharacterEncodingFilter如下:
package com.stonecai.service;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
Example filter that sets the character encoding to be used in parsing the
* incoming request, either unconditionally or only if the client did not
* specify a character encoding. Configuration of this filter is based on
* the following initialization parameters:
*
*
- encoding - The character encoding to be configured
* for this request, either conditionally or unconditionally based on
* the ignore
initialization parameter. This parameter
* is required, so there is no default.
*
- ignore - If set to "true", any character encoding
* specified by the client is ignored, and the value returned by the
* selectEncoding()
method is set. If set to "false,
* selectEncoding()
is called only if the
* client has not already specified an encoding. By default, this
* parameter is set to "true".
*
*
*
Although this filter can be used unchanged, it is also easy to
* subclass it and make the selectEncoding()
method more
* intelligent about what encoding to choose, based on characteristics of
* the incoming request (such as the values of the Accept-Language
* and User-Agent
headers, or a value stashed in the current
* user's session.
*
* @author Craig McClanahan
* @version $Revision: 1.2 $ $Date: 2006/10/28 08:51:08 $
*/
public class SetCharacterEncodingFilter implements Filter {
// ----------------------------------------------------- Instance Variables
/**
* The default character encoding to set for requests that pass through
* this filter.
*/
protected String encoding = null;
/**
* The filter configuration object we are associated with. If this value
* is null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;
/**
* Should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;
// --------------------------------------------------------- Public Methods
/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*
* @param request The servlet request we are processing
* @param result The servlet response we are creating
* @param chain The filter chain we are processing
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
// ------------------------------------------------------ Protected Methods
/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
*
null
.
*
* The default implementation unconditionally returns the value configured
* by the encoding initialization parameter for this
* filter.
*
* @param request The servlet request we are processing
*/
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
这样问题就解决了。
java的中文乱码真的很复杂,只能以后在项目实践中在深入的了解,不单单是解决方法,还包括中文的编码等方面的知识。
分享到:
相关推荐
直接横摆力矩分层控制器:上层LQR与下层数学规划在四轮独立驱动汽车转矩分配的应用,与DYC与AFS集成控制器的CarSim与Simulink联合模型研究。,直接横摆力矩分层控制器 上层LQR 下层数学规划 四轮独立驱动汽车转矩分配 DYC 与AFS集成控制器 CarSim与Simulink联合模型 ,核心关键词:直接横摆力矩分层控制器; 上层LQR; 下层数学规划; 四轮独立驱动汽车转矩分配; DYC与AFS集成控制器; CarSim与Simulink联合模型。,基于分层控制的四轮独立驱动汽车转矩分配与DYC-AFS集成控制研究
西门子200smart PLC脉冲除尘器程序及昆仑通态触摸屏组态应用:工艺流程与电气原理图的实践工程项目稳定运行报告,西门子200smart PLC所写程序的脉冲除尘器程序,昆仑通态触摸屏,包含PLC程序,触摸屏组态画面,工艺流程,电气原理图。 真实工程项目,目前稳定运行一年多 ,关键词:西门子200smart PLC;脉冲除尘器程序;昆仑通态触摸屏;PLC程序;触摸屏组态画面;工艺流程;电气原理图;真实工程项目;稳定运行一年多。,"西门子200smart PLC脉冲除尘程序真项目案例:电气稳定运行一年纪实"
MATLAB实现基于二阶锥松弛的主动配电网故障重构模型与可视化分析,MATLAB代码:基于二阶锥松弛的主动配电网故障重构及可视化 关键词:配电网 故障重构 二阶锥松弛 可视化 参考文档:《基于禁忌克隆遗传算法的配电网故障恢复重构_张利民》参考故障重构部分模型;《二阶锥松弛在配电网最优潮流计算中的应用_陈怀毅》参考二阶锥松弛部分; 仿真平台:MATLAB+yalmip+cplex 主要内容:代码主要做的是一个基于二阶锥松弛的主动配电网故障重构模型,其中,配电网部分用二阶锥进行松弛,从而将非线性问题转化为二次型问题;其次,代码可以自行设置任何一条线路发生故障,然后得出最佳的故障重构结果;最后,将故障重构结果进行可视化展示,如下图所示,可以得到清晰的故障以及重构的线路,代码非常精品,注释清晰,是研究配电网重构必备代码 ,配电网;故障重构;二阶锥松弛;可视化;仿真平台;yalmip;cplex。,基于二阶锥松弛的主动配电网故障重构与可视化研究
漫画天堂网系统 免费JAVA毕业设计 2024成品源码+论文+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
可调式电子日历与时钟系统PCB
C# 高并发高性能Socket源代码解析:适用于物联网、MES系统及游戏服务器的高效TCP与UDP通信实践。,C# 高并发高性能socket源代码。 包括tcp客户端和服务器端,udp客户端和服务器端。 所有都包括socket流控制。 此代码属于上层代码,主要应用于大批量物联网项目,mes系统及游戏服务器 它用于物联网行业.mes系统以及大型集控设备有非常大的支持。 *并非是初级的几个方法就实现的socket *图片与该无关 ,核心关键词:C#;高并发;高性能;Socket源代码;TCP客户端/服务器端;UDP客户端/服务器端;流控制;物联网项目;MES系统;游戏服务器;集控设备支持。,基于C#的高性能大批量物联网项目支持Socket通信源代码
OPC DA的C# Demo源码:助力工厂MES项目,封装实用工具类,新手友好,含注释源码与KepServer测试环境支持DCOM部署文档,OPC DA的C# Demo 源码,上位机,opcserver 此Demo为大型工厂MES项目的部分内容, 封装了的OpcDaHelper,AppConfigHelper,IniHelper的静态类,使您方便的调用类的方法快速失效功能。 非常适合新手和急需工厂设备对接项目的用户,使您省去学习的成本,源码有详细的注释,提供KepServer 的测试环境。 此项目可以通过DCOM实现程序不需要和KepServer在同一台电脑,非常适合局域网使用。 送OpcDa相关技术文档。 ,OPC DA; C# Demo 源码; 上位机; opcserver; 封装静态类; 快速失效功能; 工厂设备对接; 详细注释; 测试环境; DCOM; 局域网使用; OpcDa技术文档。,OPC DA C# Demo源码:大型工厂MES项目中的上位机通讯助手
内容概要:本文档介绍了CES(客户体验支持)团队关于客户问题管理和缺陷处理的详细培训材料。首先强调了Q1季度的目标,即解决80%的客户问题并持续改进Bug管理系统,还展示了Power BI仪表盘用于追踪问题关闭率。接着,详细介绍客户问题管理的关键角色及其职责,如IPS进程推广、问题审核与分配、Bug清理会议主持、跨部门协作、定期进度审查等。此外,文中列出了具体的Bug状态变更规则以及每种状态的最大持续时间,以确保高效解决问题和支持决策。对于新客户和服务请求,则提供了一份路线图以便快速适应。 适用人群:主要针对CES内部员工及其他相关人员进行流程规范指导。 使用场景及目标:为提高客户服务效率和质量而设立的一系列措施实施指南。通过定义明确的问题分类标准(如缺陷产品)、设定合理的处理周期、建立透明的责任机制,使客户能获得更快捷有效的产品和技术援助。同时,也为未来的自动化更新工具集成提供了初步规划。 其他说明:文档还包括一些特定客户的分配列表及联系人信息,用以帮助负责人员更好地跟进各自任务;并且提到有关于未来改进方向的思考,比如自动同步更新从IPS评论到LAN租户的数据等功能。这将有助于减少人工操作失误并加速整个反馈循环的时间表。
锂电池管理系统中的选择性放电与可重构式均衡(旁路开关技术与均衡仿真),锂电池均衡仿真 电池管理系统 选择性放电 可重构式均衡(旁路开关) ,核心关键词:锂电池均衡仿真; 电池管理系统; 选择性放电; 可重构式均衡(旁路开关)。,"基于选择性放电策略的锂电池均衡仿真及可重构式均衡管理系统研究"
OMRON CP1H PLC自由口通讯实现与麦克米特PLC及西门子SMART 200 PLC轮询通讯与断线检测实际应用程序详解,OMRON CP1H自由口通讯2个其它品牌的PLC.自由口通讯麦克米特PLC和西门子SMART200。 轮询并加断线检测。 实际项目应用,程序带有完整的注释。 ,核心关键词:OMRON CP1H; 自由口通讯; 麦克米特PLC; 西门子SMART200; 轮询; 断线检测; 实际项目应用; 完整注释。,OMRON CP1H与其他品牌PLC自由口通讯方案:轮询+断线检测 - 注释详尽的实际项目应用
Mean Shift算法在目标跟踪领域的应用研究.pdf
本代码是基于python pytorch环境安装的。 可参考博文进行安装环境运行代码-但需要先自行收集好图片放到对应文件夹下: https://blog.csdn.net/no_work/article/details/139246467 首先是代码的整体介绍 总共是3个py文件,十分的简便 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01生成txt.py,是将数据集文件夹下的图片路径和对应的标签生成txt格式,划分了训练集和验证集 运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch训练完后会显示准确率和损失值 训练结束后,会保存log日志,记录每个epoch的准确率和损失值 最后训练的模型会保
IBTA overview of IBTA
纯金属凝固过程相场模拟:Matlab快速求解与Paraview专业绘图结合展示流场影响下的微观组织演化,相场模拟(模拟凝固过程中纯金属微观组织演化)~ 1.利用matlab傅里叶谱变法求解 (快速) 2.利用paraview显示效果图(专业绘图软件) 3.将流场引入对结晶效果影响(如图3) ,核心关键词:相场模拟; 凝固过程; 纯金属微观组织演化; Matlab傅里叶谱变换法; 快速求解; Paraview显示效果图; 流场引入; 结晶效果影响。,基于相场模拟的纯金属微观组织演化研究——快速傅里叶谱变换法与专业绘图软件应用
VCU整车Simulink模型集成高压上下电、车辆蠕动等七大功能,详细文档支持,实车测试完成,适用于新能源汽车开发工程师。,vcu整车simulink模型 模型包含高压上下电,车辆蠕动,驻坡功能,能量管理,档位管理,续航里程,定速巡航等等。 每个功能都对应有详细的pdf文档详细说明,进入条件, 出条件,以及标定量详细说明。 程序已经实车测试完成。 非常适合开发新能源汽车的工程师们。 ,核心关键词:VCU整车; Simulink模型; 高压上下电; 车辆蠕动; 驻坡功能; 能量管理; 档位管理; 续航里程; 定速巡航; 程序实车测试; 新能源汽车工程师。,VCU整车Simulink模型:新能源汽车功能全解析与实测报告
PWM整流器SVPWM调制方式的仿真模型研究:空间矢量调制在Matlab中的实现,PWM整流器仿真模型,SVPWM调制方式,空间矢量调制,仿真模型。 PWM整流器matlab仿真模型,SVPWM调制 ,核心关键词:PWM整流器仿真模型; SVPWM调制方式; 空间矢量调制; Matlab仿真模型。,基于SVPWM调制的PWM整流器Matlab仿真模型研究
扫描IP工具。易语言编写。可调节线程和响应时间,绿色方便
基于模糊规则和人工势场法的机器人路径规划与避障模拟matlab程序——可手动调整障碍物坐标与数量,matlab程序,改进人工势场法模拟机器人路径规划与避障,障碍物的个数和坐标可以手动修改。 程序采用了模糊规则与人工势场算法相结合的方式来实现路径规划与避障。 起点坐标,终点坐标,障碍物坐标,障碍物个数都可以在程序里直接改。 ,MATLAB程序; 改进人工势场法; 机器人路径规划; 避障; 模糊规则; 障碍物个数与坐标调整。,MATLAB程序:模糊规则与改进人工势场法实现机器人路径规划与避障模拟
校园数字化图书馆系统 免费JAVA毕业设计 2024成品源码+论文+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"CNN卷积神经网络Matlab时间序列预测程序:高精度预测实战",CNN卷积神经网络做时间序列预测的Matlab程序,预测精度很高。 ,核心关键词:CNN卷积神经网络;时间序列预测;Matlab程序;高精度预测。,"基于CNN的Matlab程序:高精度时间序列预测"