java web返回中文乱码问题及解决

 更新时间:2023年05月25日 10:48:17   作者:瞌睡的猫00  
这篇文章主要介绍了java web返回中文乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java web返回中文乱码

ajax返回中文乱码问题

在浏览器按F12查看数据包

可以看到charset为 iso-8859-1,这是spring处理的编码,需要在controller对应映射方法上添加

produces = {“text/html;charset=utf-8”}

如图所示

java中文乱码,编码识别测试汇总

1.手机显示中文:GBK,UTF-8正常,ISO-8859-1乱码。

2.写入内容到txt:UTF-8转GBK,直接stream.write(str.getBytes(StrCharset.GBK));无效。

发现前面多了个问号?直接删。暂时这样处理了。

if(StrCharset.getEncoding(str).equals(StrCharset.ISO_8859_1))
					stream.write(str.getBytes(StrCharset.ISO_8859_1));
				else if(StrCharset.getEncoding(str).equals(StrCharset.UTF_8))
				{
					try{
					byte[] b=str.getBytes(StrCharset.GBK);
					stream.write(b,1,b.length-1);
					//stream.write(new String(str.getBytes("GBK"),"GBK").getBytes());
					}catch(Exception e)
					{
						stream.write(str.getBytes(StrCharset.GBK));
					}
				}
				else
					stream.write(str.getBytes(StrCharset.GBK));
import java.nio.charset.Charset;
public class Encoding
{
    public static String getEncoding(String str) 
    {    
        String encode;
	encode = "UTF-16";   		
        try 
	{    
            if(str.equals(new String(str.getBytes(), encode))) 
	    {   
                return encode;    
            }    
        } 
	catch(Exception ex) {} 
	encode = "ASCII";    
        try 
	{    
            if(str.equals(new String(str.getBytes(), encode)))
	    {    
                return "字符串<< " + str + " >>中仅由数字和英文字母组成,无法识别其编码格式";    
            }    
        } 
	catch(Exception ex) {}    
	encode = "ISO-8859-1";    
        try 
	{    
            if(str.equals(new String(str.getBytes(), encode))) 
	    {    
                return encode;    
            }    
        } 
	catch(Exception ex) {}    
	encode = "GB2312";    
        try 
	{    
            if(str.equals(new String(str.getBytes(), encode))) 
	    {    
                return encode;    
            }    
        } 
	catch(Exception ex) {} 
	encode = "UTF-8";    
        try 
	{    
            if(str.equals(new String(str.getBytes(), encode))) 
	    {    
                return encode;    
            }    
        } 
	catch(Exception ex) {}    
        /*
	 *......待完善
	 */
        return "未识别编码格式";    
    }  
    public static void main(String[] args)
    {
	//获取系统默认编码
	System.out.println("系统默认编码:" + System.getProperty("file.encoding")); //查询结果GBK
	//系统默认字符编码
	System.out.println("系统默认字符编码:" + Charset.defaultCharset()); //查询结果GBK
	//操作系统用户使用的语言
	System.out.println("系统默认语言:" + System.getProperty("user.language")); //查询结果zh
	System.out.println();
	String s1 = "hi, nice to meet you!";
	String s2 = "hi, 我来了!";
	System.out.println(getEncoding(s1));
	System.out.println(getEncoding(s2));
	}
}

测试结果

// java获取字符串编码格式
	public static String getEncoding(String str) {
		String encode = "GB2312";
		try {
			if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是GB2312
				String s = encode;
				return s; // 是的话,返回“GB2312“,以下代码同理
			}
		} catch (Exception exception) {
		}
		encode = "ISO-8859-1";
		try {
			if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是ISO-8859-1
				String s1 = encode;
				return s1;
			}
		} catch (Exception exception1) {
		}
		encode = "UTF-8";
		try {
			if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是UTF-8
				String s2 = encode;
				return s2;
			}
		} catch (Exception exception2) {
		}
		encode = "GBK";
		try {
			if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是GBK
				String s3 = encode;
				return s3;
			}
		} catch (Exception exception3) {
		}
		return "unknown"; // 如果都不是,说明输入的内容不属于常见的编码格式。
	}

各种编码都显示出去看看

        System.out.println("中文");
        System.out.println("中文".getBytes());
        System.out.println("中文".getBytes("GB2312"));
        System.out.println("中文".getBytes("ISO8859_1"));
        System.out.println(new String("中文".getBytes()));
        System.out.println(new String("中文".getBytes(), "GB2312"));
        System.out.println(new String("中文".getBytes(), "ISO8859_1"));
        System.out.println(new String("中文".getBytes("GB2312")));
        System.out.println(new String("中文".getBytes("GB2312"), "GB2312"));
        System.out.println(new String("中文".getBytes("GB2312"), "ISO8859_1"));
        System.out.println(new String("中文".getBytes("ISO8859_1")));
        System.out.println(new String("中文".getBytes("ISO8859_1"), "GB2312"));
        System.out.println(new String("中文".getBytes("ISO8859_1"), "ISO8859_1"));
//判断当前字符串的编码格式
if(destination.equals(new String(destination.getBytes("iso8859-1"), "iso8859-1")))
{
  destination=new String(destination.getBytes("iso8859-1"),"utf-8");
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring 校验(validator,JSR-303)简单实现方式

    Spring 校验(validator,JSR-303)简单实现方式

    这篇文章主要介绍了Spring 校验(validator,JSR-303)简单实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Springboot中使用Filter实现Header认证详解

    Springboot中使用Filter实现Header认证详解

    这篇文章主要介绍了Springboot中使用Filter实现Header认证详解,当在 web.xml 注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,它可以决定是否将请求继续传递给 Servlet 程序,以及对请求和响应消息是否进行修改,需要的朋友可以参考下
    2023-08-08
  • JAVA并发编程有界缓存的实现详解

    JAVA并发编程有界缓存的实现详解

    这篇文章主要介绍了JAVA并发编程有界缓存的实现详解的相关资料,这里举例说明如何实现,四种方法一一代码实现,需要的朋友可以参考下
    2016-12-12
  • java 配置MyEclipse Maven环境具体实现步骤

    java 配置MyEclipse Maven环境具体实现步骤

    这篇文章主要介绍了 java 配置MyEclipse Maven环境具体实现步骤的相关资料,具有一定的参考价值,需要的朋友可以参考下
    2016-11-11
  • 基于Spring框架的Shiro配置方法

    基于Spring框架的Shiro配置方法

    这篇文章主要介绍了基于Spring框架的Shiro配置方法,需要的朋友可以参考下
    2014-10-10
  • JAVA利用接口实现多继承问题的代码实操演示

    JAVA利用接口实现多继承问题的代码实操演示

    Java语言并不支持多继承,这是由于多继承会带来许多复杂的问题,例如"菱形问题"等,下面这篇文章主要给大家介绍了关于JAVA利用接口实现多继承问题的相关资料,需要的朋友可以参考下
    2024-03-03
  • BigDecimal的加减乘除计算方法详解

    BigDecimal的加减乘除计算方法详解

    小编做题遇到了大数的精确计算,再次认识了bigdecimal关于Bigdecimal意外的有许多小知识点和坑,这里特此整理一下为方便以后学习,希望能帮助到其他的萌新
    2021-08-08
  • Spring Boot日志收集及链路追踪实现示例

    Spring Boot日志收集及链路追踪实现示例

    这篇文章主要为大家介绍了Spring Boot日志收集及链路追踪实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Eureka源码阅读Client启动入口注册续约及定时任务

    Eureka源码阅读Client启动入口注册续约及定时任务

    这篇文章主要为大家介绍了Eureka源码阅读Client启动入口注册续约及定时任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • java基础篇之Date类型最常用的时间计算(相当全面)

    java基础篇之Date类型最常用的时间计算(相当全面)

    这篇文章主要给大家介绍了关于java基础篇之Date类型最常用的时间计算的相关资料,Java中的Date类是用来表示日期和时间的类,它提供了一些常用的方法来处理日期和时间的操作,需要的朋友可以参考下
    2023-12-12

最新评论