搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
不正经
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
如何画好一张架构图?
2
Dalle-3、Sora、Stable Diffusion 3 掀起AIGC新浪潮_dalle 3
3
深度解析 PyTorch Autograd:从原理到实践_pytorch和有限差分
4
大家期待的 OceanBase 4.0 发包了,很多新特性让人眼前一亮,大家可以上手测试一下了_oceanbase4原理
5
jstat命令解析_jstat命令详解
6
Flask启用SSL加密传输_flask ssl_context
7
Airtest自动化测试篇——Airtest简介_arttest自动化
8
SELinux零知识学习六、swig源码下载、编译和安装
9
【MySQL索引】提高查询速度和效率_mysql 索引查询速度
10
IntelliJ IDEA 2024.1安装与激活[破解]_idea2024.1版本激活
当前位置:
article
> 正文
各种中文乱码的解决方法 (转)
作者:不正经 | 2024-04-22 09:58:18
赞
踩
各种中文乱码的解决方法 (转)
一、Java中文问题的由来
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上或基本上就能解决这类乱码问题。
本文要重点讨论的是第二类乱码,即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换,具体情况如下:
从页面form提交数据到java程序 byte->char
从java程序到页面显示 char?>byte
从数据库到java程序 byte?>char
从java程序到数据库 char?>byte
从文件到java程序 byte->char
从java程序到文件 char->byte
从流到java程序 byte->char
从java程序到流 char->byte
如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。
二、解决方法
前面已经提到了Java程序与其他媒介交互时字符和字节的转换过程,如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致,下面分别论述(Java或JSP自身产生的乱码请参看第一部分)。
1、JSP与页面参数之间的乱码
JSP获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前,强制指定request获取参数的编码方式:request.setCharacterEncoding("GBK")或request.setCharacterEncoding("gb2312")。
如果在JSP将变量输出到页面时出现了乱码,可以通过设置response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解决。
如果不想在每个文件里都写这样两句话,更简洁的办法是使用Servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:
web.xml:
CharacterEncodingFilter
net.vschool.web.CharacterEncodingFilter
encodingGBK
CharacterEncodingFilter
/*
CharacterEncodingFilter.java:
public class CharacterEncodingFilter implements Filter
{
protected String encoding = null;
public void init(FilterConfig filterConfig) throws ServletException
{
this.encoding = filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}
}
2、Java与数据库之间的乱码
大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode,如Microsoft的SQLServer驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如如mm的mysql驱动:jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding=GBK。
3、Java与文件/流之间的乱码
Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用FileReader和FileWriter的父类:InputStreamReader/OutputStreamWriter,它们也是基于字符的,但在构造函数中可以指定编码类型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。
4、其他
上面提到的方法应该能解决大部分乱码问题,如果在其他地方还出现乱码,可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中,你必须知道原来字节或转换后的字节的编码方式,转换时采用的编码必须与这个编码方式保持一致。我们以前使用Resin服务器,使用smartUpload组件上传文件,上传文件同时传递的中文参数获取没有乱码问题。当在Linux中把Resin设置成服务后,上传文件同时的中文参数获取出现了乱码。这个问题困扰了我们很久,后来我们分析smartUpload组件的源文件,因为文件上传采用的是字节流的方式,里面包含的参数名称和值也是字节流的方式传递的。smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来,问题就出现在smartUpload将字节流转换成字符串时采用了系统默认的编码,而将Resin设置成服务后,系统默认的编码可能发生了改变,因此出现了乱码。后来,我们更改了smartUpload的源文件,增加了一个属性charset和setCharset(String)方法,将upload()方法中提取参数语句:
String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );
改成了
String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );
终于解决了这个乱码问题。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/不正经/article/detail/468123
推荐阅读
article
题解
| #
IP地址
转化#
不要
被题目迷惑
了
,
直接
计算就行
了
。_国控数科
三方
...
八大职类:技术类、供应链类、产品类、运营类、设计类、职能类、风控类、商品。毁灭吧,累
了
,如果我有灭霸的那个拳套,我一定打...
赞
踩
article
如何
写出一篇爆款
文章
?【
CSDN
攻略】
创作技巧
篇_
csdn
写出爆文...
今天分享的一些小小心得,分别从选题、起标题、撰文原则、发文技巧等多个方面进行介绍,希望对大家能有所帮助。_
csdn
写出爆...
赞
踩
article
MySQL 对
日期
使用
DATE
_
FORMAT
()函数_
mysql
date
_
formate
...
前面使用
日期
时间函数,获取到的要么是 yyyy-mm-dd 形式的
日期
,要么是 hh:MM:ss 形式的时间,或者是 y...
赞
踩
article
adb
和
shell
常规
命令
使用_
adb
shell
命令
的使用...
1,通过
adb
连接(WiFi连接或者数据线连接)Android设备2,PC端进入
命令
窗口(win +R 组合键后,输入...
赞
踩
article
xilinx
7
系列
FPGA
时钟
布线资源...
7
系列
FPGA
拥有多种
时钟
路由资源,以支持各种
时钟
方案和需求,包括高扇出、短传播延迟以及极低的偏斜。
xilinx
7
系列
...
赞
踩
article
AI
领域
存在
的
挑战及应
对策
略有哪些?_ai开发中
存在
的
问题
及
对策
...
作者:禅与计算机程序设计艺术 1.简介随着技术
的
进步和应用
的
广泛程度,人工智能(
AI
)已成为新时代技术
的
重要组成...
赞
踩
article
记一次
starRocks
中
更新
模型
联合
主键
添加
实现
...
原子替换记一次
starRocks
中
更新
模型
联合
主键
添加
实现
1.需求描述 在一个
更新
模型的表中,...
赞
踩
article
PE文件-C++-
SetCurrentDirectory
当前
工作文件夹编辑-GetCommandLi...
控制台进程可以通过将它们实现为程序入口点来使用main或wmain函数的argc和argv参数。因此,请为路径指定MAX...
赞
踩
article
(十七)
SQL
数据
操纵语言_用
sql
语句
完成如下题: 1、
插入
一条记录:
empno
–1587、en...
文章目录
SQL
操纵
数据
(DML)添加一个新行到表中INSERT
语句
语法指定列添加完全列添加
插入
带空值的行隐式方式显式方...
赞
踩
article
PyTorch
深度
学习
快速
入门教程
【
小
土堆
】
学习
笔记_
小
土堆
学习
笔记...
目录
学习
视频地址 —— B站1 pyTorch安装和配置已经测试,速度很慢,30kB/s已经测试,最有效的办法,速度最快...
赞
踩
article
Java
方法
的
使用与
方法
重载
_
java
方法
重载
的
实际应用...
文章目录1.
方法
的
定义与使用1.1 什么是
方法
1.2
方法
的
定义语法1.3
方法
的
调用1.4关于实参和形参之间
的
关系(重...
赞
踩
article
【
逻辑
学习笔记】
uart
_
tx
模块
-改进
_
tx
并行
转
串行
...
第二版:使用FIFO,在FIFO的wr
_
clk是用户的高速时钟,FIFO的rd
_
clk是
uart
_
tx
_
engine的低...
赞
踩
article
【做算法学
数据结构
】【
链表
】
删除
排序
链表
中
的
重复
元素...
当涉及到
数据结构
时,
链表
是一种常见且重要
的
数据结构
。
链表
由一系列节点组成,每个节点包含数据和指向下一个节点
的
引用。相比于...
赞
踩
article
FPGA
入门 ——
FPGA
UART
串口
通信
_
uart
通信
延时...
UART
通用异步收发传输器( Universal Asynchronous Receiver/Transmitter)...
赞
踩
article
项目经理
--
要
具备
的
能力_
项目经理
需
要
具备
哪些能力...
我想先请你做一道选择题。你团队中如果有一个管理者
要
离职,现在有两个人选来替补他。选项A是另一个平级团队
的
管理者,选项B是...
赞
踩
article
github
实用
指令
(
实验室
打工人入门必备
)
_
github
指令
...
情景一:在实验器服务器上修改了一段代码,但是需要学长检查后再merge,那么在此时,我们需要实现的是先创立一个名为“te...
赞
踩
article
第一节
数据类型
与结构...
数据类型
、类型检测
第一节
数据类型
与结构 数据结构与算法 一...
赞
踩
article
python
:
性能
优化
(
一
)_
python
+=
性能
...
python
性能
优化
01 在列表里面计数
性能
:
第二种计数方法比第
一
种快不要太多,因为Python原生的内置函数都是优...
赞
踩
article
Unity
的
PICO
项目基础
环境
搭建笔记(
环境
配置篇)_
unity
pico
...
Unity
的
PICO
项目基础
环境
搭建笔记(
环境
配置篇)_
unity
pico
unity
pico
...
赞
踩
article
JAVA
八股、
JAVA
面经_
java
不
支持
操作符重载
,
虽然
可以
对
两个
string
对
象执行加法运...
JAVA
八股、
JAVA
面经_
java
不
支持
操作符重载
,
虽然
可以
对
两个
string
对
象执行加法运算
,
但是这是
语言
内j...
赞
踩
相关标签
java
写作
总结
经验分享
mysql
数据库
sql
android
adb
shell
fpga开发
大数据
人工智能
语言模型
Java
Python
架构设计
PE文件
C++
当前工作文件夹编辑
GetCommandLine
函数获取当前命令行参数
SQL
Oracle
数据操纵语言