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的中文乱码真的很复杂,只能以后在项目实践中在深入的了解,不单单是解决方法,还包括中文的编码等方面的知识。
分享到:
相关推荐
NIP6000系列产品是华为技术有限公司(以下简称华为)推出的新一代专业入侵防御产品,主要应用于企业、IDC(Internet Data Center)和校园网等,为客户提供应用和流量安全保障。 NIP6000系列产品既具备传统IPS产品的功能又在此基础上进行了扩展,更好地保障客户应用和业务安全: •标准的IPS功能 提供丰富的面向漏洞和威胁的签名库,及时检测并阻断攻击。 •应用感知、应用层威胁防御 具备强大的网络应用识别和管控能力,管理员可以基于应用配置安全策略、带宽策略等进行应用管控,而不仅限于基于端口、协议、服务的策略配置。 同时,NIP6000系列产品可防御针对各类应用的攻击,保障应用安全。 •环境感知 通过录入资产信息(操作系统、资产类型、资产价值等),NIP6000系列产品结合资产情况对攻击事件进行风险评估,标识攻击事件风险级别,为管理员提供可靠的事件结果。 同时管理员可以根据资产信息,选择合适的操作系统、应用等生成入侵防御策略,进行有针对性地防护。 •未知威胁检测 通过与沙箱联动检测APT攻击、零日攻击等新型网络攻击。
工作模板 -2025年度安全检查工作计划.doc
1、文件内容:google-noto-sans-bamum-fonts-20141117-5.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/google-noto-sans-bamum-fonts-20141117-5.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
2024年度部门决算报表及相关编审资料(1115)-改.zip
2cd36c672d44edff9777d9256b1ca68c.part02
gergdfvd
内容概要:本文介绍了在数据结构课程中开发的一款校园点餐系统,旨在改善师生点餐排队耗时和服务效率低下问题。系统支持堂食和外卖服务,经理可实时监控销售和利润情况。文章详细讲述了系统设计过程,涉及的主要模块涵盖菜单管理、订单处理、成本与盈余统计等。此外,引入迪杰斯特拉(Dijkstra)算法进行最优路线查找以规划最高效的送餐线路,并且通过多种折扣规则鼓励消费。 适合人群:对数据结构有兴趣的学习者或开发者、从事校园餐饮服务业的技术管理者、关注高校智能信息化建设的研究人员等。 使用场景及目标:该项目适用于高校食堂及其他教育机构的小型连锁餐馆,目的在于提供高效快捷且个性化的就餐解决方案;其终极目标在于通过技术创新提升顾客体验质量和服务运作效能。 其他说明:文中还包括详细的算法讲解和技术细节实现步骤,如订单生成机制、支付处理逻辑、地理位置映射方法等。作者还提到关于项目的感想和个人收获,包括需求分析的意义,用户体验设计的重要性,以及项目管理和团队协作经验等方面的内容。最后列举了几篇参考文献供进一步研究学习之用。
1、文件内容:gobject-introspection-devel-1.56.1-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/gobject-introspection-devel-1.56.1-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
HCIA-Datacom V1.0 培训材料-PPT教材实验手册环境
1、文件内容:giflib-utils-4.1.6-9.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/giflib-utils-4.1.6-9.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
内容概要:本文探讨了基于大型语言模型(LLM)的算法在不同经济环境中自主合谋现象的存在与特点。研究发现,在重复垄断和双寡头市场实验中,LLM定价代理能够快速收敛到高于竞争价格水平的价格,导致消费者福利受损。特别是在看似无害提示语的背景下,这些代理行为显示出更高的自主合谋倾向。进一步研究表明,LLM定价代理表现出避免价格战的策略,采取奖励惩罚机制,维持较高价格水平。此外,文本分析显示,不同提示语显著改变了代理的行为策略。文章强调,LLM算法合谋可能带来反垄断法规新挑战,并对未来反垄断立法有潜在的影响。 适合人群:经济学研究人员、政策制定者以及对自动化决策系统感兴趣的读者。 使用场景及目标:本研究旨在提高学术界和实务界对于算法定价可能导致自主合谋的理解。适用于评估未来可能出现由LLM引起的新型自动算法合谋风险的情景下。 其他说明:尽管本研究揭示了LLM定价代理人存在自主合谋的可能性,但作者也指出其实验环境较为简单,并未考虑现实市场的复杂性。随着生成式AI技术的发展,这类风险可能会变得更加普遍和具体。文中提到的一些实验证据也支持算法合谋行为受到特定提示词汇的影响较大。
Matlab Simulink下的二阶线性自抗扰控制器(LADRC)仿真模型:快速响应与优异抗干扰性能,成功应用于电机速度控制,matlab simulink二阶线性自抗扰控制器(LADRC)仿真模型,已经封装完成,响应速度快,抗扰能力相较于传统pi更优秀。 采用线性ADRC相较于非线性ADRC大大减少了调参难度,已成功用于电机速度环替代传统pi。 ,关键词:Matlab Simulink;二阶线性自抗扰控制器(LADRC);仿真模型;封装完成;响应速度快;抗扰能力优秀;线性ADRC;调参难度低;电机速度环;传统PI替代。,Matlab Simulink:二阶线性自抗扰控制器(LADRC)仿真模型,调参简便,响应快速且抗扰性强
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
LeNet-5模型代码复现
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借Spring Boot框架搭建后台。前台采用支持HTML5的VUE框架。用MySQL存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
混合式全桥LLC谐振变换器:变频控制与移相控制的完美结合,闭环控制输出电压,实现软开关与自动调频移相切换,稳定波形展示,变频控制与移相控制组成的混合式控制全桥LLC谐振变器仿真(PFM+PSM混合控制) 输出电压闭环控制,软开关,宽范围,可实现调频和移相的自动切,调频和移相控制下的稳定波形如图所示 matlab simulink和plecs模型都有 ~ ,关键词:混合式控制全桥LLC谐振变换器; PFM+PSM混合控制; 输出电压闭环控制; 软开关; 宽范围; 调频和移相自动切换; 稳定波形; Matlab Simulink模型; PLECS模型。,"混合控制全桥LLC谐振变换器仿真:PFM与PSM协同,实现宽范围稳定输出"
1、文件内容:gnutls-dane-3.3.29-9.el7_6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/gnutls-dane-3.3.29-9.el7_6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
qeqweqweqwwwwwwwwwwwww
1、文件内容:glusterfs-client-xlators-6.0-61.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/glusterfs-client-xlators-6.0-61.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
基于Xilinx FPGA的实时Sobel边缘检测与BMP图像仿真工程:卷积处理与直观展示,基于FPGA的实时Sobel边缘检测项目工程+bmp图片仿真工程 采用基于Xilinx ZYNQ FPGA进行开发,通过OV5640实时采集图像,经过Sobel边缘检测模块通过卷积实现实时的Sobel边缘检测。 工程附带仿真文件,可读取bmp图片并模拟摄像头时序进行仿真,能够输出Sobel边缘处理后的bmp图像,仿真十分直观。 关键词: FPGA Xilinx Vivado Sobel 图像处理 ,基于Xilinx FPGA的Sobel边缘检测; 实时图像采集; 卷积处理; 图像仿真; bmp图片处理; 图像处理后输出; 实时采集与仿真。,基于Xilinx ZYNQ FPGA的Sobel边缘检测与BMP图片仿真工程