关于Java开发Idea中编码,解码以及解决中文乱码的实践经验
前言
关于这一块,特别是中文乱码,网上教程多得不能再多了,大家各抒己见,各种有着自己的实践经验和体会,但是吧,idea这东西,本身也做为IDE,集成开发环境,里面的很多配置对用户来说唯有API设置是可见的,于是就有一系列的设置来解决IDE上的问题。
关于编码和解码
编码,在设置以xxx格式编码时,比如在一个文本下,输入一个hello,并设置编码形式是"UTF-8",那么这个文本就是“UTF-8”编码格式下的"hello"。
解码:在上面的基础上,“utf-8”编码下的文件当然要对应用"utf-8"来进行解码。
总之:编码和解码的格式要保持一致。“UTF-8”的文件用“GBK”打开当然是会出现中文乱码的。
关于中文乱码
这点当我在使用tomact服务器打印日志时出现了这个问题。
idea中关于编辑器的编码设置
File/Directory Encoding 优先于 Project Encoding,Project Encoding 优先于 Global Encoding 。
试想这样一个常见的场景,servlet对一个请求返回中文字符串。
解决Servlet的response的中文乱码
response设置使用编码为“utf-8”,这样在Idea的编辑器里返回中文字符,哪所写的中文字符到底是编辑器的编码方式还是response里设置的编码方式?
答案是:为response里设置的编码方式(经过我测试,java文件是UTF-8编码,response里设置成GBK,则response里的中文为response里设置的编码)
测试如下:Response设置成GBK
package com.cast.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(value = "/test")
public class test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException ,IOException
{
//第一种方式
response.setContentType("text/html;charset=GBK");
//第二种方式
// response.setCharacterEncoding("utf-8");
// response.setHeader("Content-Type","text/html;charset=UTF-8");
PrintWriter printWriter =response.getWriter();
printWriter.write("你好,世界!");
printWriter.flush();
printWriter.close();
}
}
编辑器里对该文件设置编码为UTF-8
查看网页的解码
结果是正确的。
若设置java文件编码为utf-8,控制台打印代码里的中文的提示语句。 控制台解码默认是系统的编码为"GBK"。用“GBK”的方式进行解码,则肯定为中文乱码。
解决控制台中文乱码
使得控制台显示中文字符时的解码格式与中文字符的编码格式一致。
第一种:把编辑器设置成与控制台相对应的编码。控制台默认是GBK,则编辑器也为GBK。
第二种:把控制台编码设置为编辑器设置的编码。编辑器为UTF-8,则控制台也为UTF-8.
如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?