Java中文异常——全解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Java中文异常——全解

1、字符集不匹配

如果在处理中文字符时出现乱码或无法正确显示的情况,很可能是由于字符集不匹配导致的。Java中常用的字符集是UTF-8和GBK,确保输入、输出和存储的字符集一致。

2、文件编码问题

在读取或写入文件时,需要指定正确的字符集。可以使用InputStreamReader和OutputStreamWriter来指定字符集,例如:UTF-8类型的读取

读取的时候由于编码不统一造成乱码。

只需要同步编码类型即可。

import java.io.*;
public class Test {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("D:\\save\\study\\javaStu\\APIDemos\\src\\main\\java\\file.txt");
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while((line = br.readLine())!=null){
                System.out.println(line);
            }
            br.close();
        } catch (FileNotFoundException | UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

这里用的是绝对路径,如果相对路径建议使用反射的方式读取文件。

import org.springframework.util.ResourceUtils;
String path = new File(ResourceUtils.getURL("classpath:").getPath().toString()).getAbsolutePath();

有了这个路径再去寻找指定文件就靠谱了。

3、字符串编码转换

如果需要对字符串进行编码转换,可以使用String的getBytes和构造函数来指定字符集

import java.io.UnsupportedEncodingException;
public class Test {
    public static void main(String[] args) {
        String str = "中文";
        byte[] utf8Bytes = new byte[0];
        try {
            utf8Bytes = str.getBytes("UTF-8");
            String gbkStr = new String(utf8Bytes, "GBK");
            System.out.println(gbkStr);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
}

正确操作

4、URL编码问题

在处理URL时,需要对其中的中文字符进行编码。可以使用java.net.URLEncoder来进行URL编码。

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Test {
    public static void main(String[] args) {
        try {
            String url = "http://example.com?userName=中文";
            String encodedUrl = URLEncoder.encode(url, "UTF-8");
            String decodeUrl = URLDecoder.decode(encodedUrl, "UTF-8");
            System.out.println(encodedUrl);
            System.out.println(decodeUrl);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
}

有两个包操作

import java.net.URLDecoder;
import java.net.URLEncoder;

5、数据库编码问题

在与数据库交互时,需要确保数据库连接和表的字符集设置正确。可以在连接字符串中指定字符集。

String url = "jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=UTF-8";

示例:

jdbc:mysql://rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com:3306/test?characterEncoding=utf8

6、HttpServletRequest中文过滤

在JavaWeb中,可以使用过滤器(Filter)来对请求中的中文进行过滤处理。过滤器是在Servlet容器中用来拦截请求和响应的组件,可以对请求进行修改、增强或者验证等操作。

要实现对请求中的中文进行过滤,可以按照以下步骤进行操作:

创建一个过滤器类,实现javax.servlet.Filter接口,并重写doFilter方法。

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class ChineseFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作,如果有需要可以在这里进行
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String method = httpRequest.getMethod();
        // 只对POST请求进行处理,可以根据需要修改
        if ("POST".equals(method)) {
            request.setCharacterEncoding("UTF-8");
        }
        // 继续执行过滤链
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
        // 销毁操作,如果有需要可以在这里进行
    }
}

在web.xml配置文件中配置过滤器和过滤器映射。

<filter>
    <filter-name>ChineseFilter</filter-name>
    <filter-class>com.example.ChineseFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ChineseFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

上述代码中,com.example.ChineseFilter需要替换为你实际的过滤器类的完整路径。

这样配置后,过滤器会拦截所有的请求,并对POST请求中的中文参数进行UTF-8编码处理,确保正确处理中文字符。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
44 4
|
19天前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
2天前
|
Java 编译器 程序员
【Java ——异常机制详解】
try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。 catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。 finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。 throw – 用于抛出异常。
|
6天前
|
Java 程序员 数据库
|
7天前
|
Java 程序员 数据库连接
|
10天前
|
Java 数据安全/隐私保护
Java中的异常
Java中的异常
8 3
|
11天前
|
SQL Java
Java的异常类
Java的异常类
4 0
|
12天前
|
Java
【JAVA学习之路 | 提高篇】自定义异常类
【JAVA学习之路 | 提高篇】自定义异常类
|
12天前
|
Java
【JAVA学习之路 | 提高篇】异常的处理(throws)与手动抛出异常(throw)
【JAVA学习之路 | 提高篇】异常的处理(throws)与手动抛出异常(throw)
|
12天前
|
Java 编译器 数据库连接
【JAVA学习之路 | 提高篇】异常的处理(try-catch-finally)
【JAVA学习之路 | 提高篇】异常的处理(try-catch-finally)