当前位置:首页 > 后端开发 > 正文内容

JDK 18 及以上运用规范输出流中文输出乱码问题

邻居的猫1个月前 (12-09)后端开发1215

著作权归作者一切。
商业转载请联络作者取得授权,非商业转载请注明出处。
链接:https://stazxr.cn/2024/12/05/JDK-18-以上运用规范输出流中文输出乱码问题/
来历:終わり群星

问题描绘

原因是 tomcat 调用servlet输出的System.out.println(也便是所说的操控台输出流)中文乱码,可是其他输出没有受到影响。

问题剖析

运转环境:JDK 21, Tomcat 10

我一切的代码都是UTF-8编码的,而且在IDEA中设置了UTF-8编码。

而且Tomcat也装备了-Dfile.encoding=UTF-8选项

经过检查System.out的编码办法,发现是GBK,可是在操控台的编码办法是UTF-8

System.out.println(System.out.charset());   // System.out.charset()办法自jdk18起
// output: GBK

运用jdk17的时分没有问题,可是运用jdk21就会呈现乱码问题。

处理方案

参阅JEP 400: UTF-8 by Default (openjdk.org)经过调用getProperty办法获取默许字符集

System.out.println("Java Runtime version " + System.getProperty("java.runtime.version"));
System.out.println("----------------------------------------------------------");
//大局默许编码 JDK21是UTF
System.out.println("Charset.defaultCharset()                    = " + Charset.defaultCharset());
//默许文件的编码,这个应该是字节码文件
System.out.println("System.getProperty(\"file.encoding\")       = " + Charset.defaultCharset().displayName()); 
//获取的是本地的字符集编码,中文windows体系应该是GBK
System.out.println("System.getProperty(\"native.encoding\")     = " + System.getProperty("native.encoding"));
System.out.println("System.getProperty(\"sun.jnu.encoding\")    = " + System.getProperty("sun.jnu.encoding"));
//这个是输出流的默许字符集编码
System.out.println("System.getProperty(\"sun.stdout.encoding\") = " + System.getProperty("sun.stdout.encoding"));
//这个是过错流的默许编码
System.out.println("System.getProperty(\"sun.stderr.encoding\") = " + System.getProperty("sun.stderr.encoding"));
//console默许编码
System.out.println("System.console().charset()                  = " + System.console().charset());
//当时输出流的编码
System.out.println("System.out.charset()                        = " + System.out.charset());
System.out.println("----------------------------------------------------------");

在一般的情况下System.getProperty("sun.stdout.encoding")System.getProperty("sun.stderr.encoding")的值是UTF-8,可是在Tomcat中是null

tomcat 10 不会指定输出流的字符编码

所以咱们需要在发动tomcat的时分指定输出流的字符编码

是在发动装备中的 VM options 增加参数:

-Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8

这种办法只能处理所设置程序的编码问题,若需处理 Javadoc 的乱码,则需在-D前增加-J。

-J-Dstdout.encoding=UTF-8 -J-Dstderr.encoding=UTF-8

总结

乱码问题只呈现在jdk18及以上的版别,由于Java 18 中将默许编码改为了 UTF-8,但没有改动System.out和System.err的编码。

所以运用jdk17没有问题,可是在运用jdk21就会呈现乱码问题。

只要在 VM options 中增加 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 即可设置输出流的编码。

参阅

写在最终

End

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=136

分享给朋友:

“JDK 18 及以上运用规范输出流中文输出乱码问题” 的相关文章

Callback详解

Callback详解

Callbacks Callback Registration 在 Rails 中,回调(Callbacks)是一种在模型目标的生命周期中履行特定代码的机制。回调能够在模型目标的创立、更新、删去等操作中履行特定的代码,例如保存目标前履行某些逻辑,或许在目标被删去前履行整理操作。 Rails 中的回调...

r语言和c语言,历史背景与设计理念

r语言和c语言,历史背景与设计理念

R语言和C语言都是编程语言,但它们的应用领域和设计理念有所不同。R语言是一种统计编程语言和图形语言,主要用于数据分析、统计计算和图形展示。它是由Ross Ihaka和Robert Gentleman于1993年开发的,后来由R Foundation维护。R语言具有丰富的统计函数库,可以方便地进行数据...

java面经,从基础知识到实战经验

java面经,从基础知识到实战经验

为了帮助你更好地准备Java面试,我整理了一些关键的经验和技巧,希望对你有所帮助。 面试前的准备1. 心态调整: 正视自己的能力:不要高估也不要低估自己。清楚自己的能力范围,不要给自己过高的期望,以免心理压力过大。 积极的心态:保持积极乐观的态度,不要总给自己消极的暗示。遇到困难时,积极...

java算法,基础概念与常用算法解析

java算法,基础概念与常用算法解析

Java是一种广泛使用的高级编程语言,用于开发各种应用程序,包括桌面应用程序、Web应用程序、移动应用程序和游戏等。在Java中实现算法时,通常需要遵循一定的步骤和最佳实践,以确保代码的效率、可读性和可维护性。1. 理解算法:在开始编码之前,确保你完全理解了算法的工作原理。这包括理解算法的输入、输出...

swift查询,如何轻松查询银行的SWIFT代码

查询SWIFT代码1. 全球银行SWIFT Codes...

java锁,Java锁概述

java锁,Java锁概述

Java 中的锁是一种用于控制多个线程对共享资源的访问的工具。在 Java 中,有多种类型的锁,包括:1. 内置锁(Intrinsic Locks): 内置锁是基于对象的锁,也称为监视器锁。每个 Java 对象都有一个内置锁,当一个线程访问对象的同步方法或同步代码块时,它会自动获取该对象的内置...