idea中maven项目System.out.print("中文")控制台输出乱码终极版

本文解决了IDEA中出现的中文乱码问题,通过检查特定文件的编码设置,特别是.idea/encodings.xml文件中对个别文件指定的特殊编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在idea写一个maven项目测试的时候发现凡是System.out.println()输出有中文的,控制台就会出现中文乱码,中文数据保存到数据库也是乱码然后特意写了一个测试类如下:

发现控制台输出的确实是乱码,奇怪的是我去其它项目中写一个这样的测试类,控制台却没有出现中文乱码,很奇怪,然后我按照网上的方法各种改,包括在设置中改File Encodings、在Java Compiler添加-encoding utf-8、在idea64.exe.vmoptions中添加-Dfile.encoding=UTF-8、还是在VM Options 中添加 -Dfile.encoding=GB2312或者-Dfile.encoding=UTF-8,发现对我的项目都没有用。

        最后我想可能是我这个项目的环境配的有问题,于是我就重新建了一个项目,项目刚建好的时候我就写了一个测试类,控制台没有出现中文乱码,然后我就把一个个的代码文件都粘了过去,一测试控制台中文乱码又出现了,然后我就意识到应该是项目中某个文件编码格式的问题了,然后我找了半天也没找到,设置的都是UTF-8,无奈又去网上搜。

        最后的问题就是所有配置都没问题,但是仍然输出乱码,这个时候只有一种解释:IDEA把你的字体编码弄错了,但是在哪里弄错的呢。经过多次排查寻找,终于,在项目的目录下有个.idea的文件夹,这个文件夹里有个encodings.xml的文件,里面记录了你某些文件所对应的特殊编码,然后我就发现:

发现这个login.jsp和showAllFil.jsp的charset是GBK ,然后我就去看了看我对应的这俩文件  发现:

好吧,终于找到了原因,真让人难受,这个页面是粘别人的,事实证明不能乱粘代码,最后把这个地方改成UTF_8,然后把在.idea的文件夹下的encodings.xml的文件中的这些GBK格式的都给删掉,rebuild项目,问题解决!

<think>我们正在讨论如何配置SLF4J将System.out的日志输出控制台。根据引用[4],我们了解到有一个工具可以将System.out重定向到SLF4J,但用户的问题是如何配置SLF4J来输出System.out的日志到控制台。 注意:通常,SLF4J本身并不直接处理System.out输出System.out是Java的标准输出流,而SLF4J是一个日志门面,用于记录应用程序日志。但是,我们可以通过一些方法将System.out的打印重定向到SLF4J,然后由SLF4J的底层实现(比如Logback)输出控制台。 然而,用户的问题可能被误解了。用户说:“我想配置SLF4J将System.out日志输出控制台”。这可能有以下两种理解: 1. 用户希望将应用程序中通过System.out.println输出的内容也通过SLF4J记录,并输出控制台(即重定向System.out到SLF4J)。 2. 用户已经使用SLF4J记录日志,并希望这些日志输出控制台(这是SLF4J默认就会做的,但可能需要配置日志级别等)。 根据引用[4]的内容,我们有一个工具可以将System.out重定向到SLF4J。但是,用户要求的是将System.out的日志输出控制台,而控制台本来就是System.out的默认输出位置,所以这里可能是指第一种理解:将System.out的内容通过SLF4J来输出,这样SLF4J可以控制这些内容的输出(比如格式、级别等),并且仍然输出控制台。 步骤: 1. 添加依赖:使用`sysout-over-slf4j`库来重定向System.outSystem.err到SLF4J。 2. 配置SLF4J的底层实现(比如Logback)来输出控制台。 但是,请注意:重定向System.out后,所有System.out的打印都会变成SLF4J的日志,然后由日志框架输出。而日志框架默认就会输出控制台(除非配置了其他追加器,如文件)。 因此,我们分步骤进行: 第一步:添加依赖(以Maven为例) 在pom.xml中添加以下依赖: ```xml <dependency> <groupId>uk.org.lidalia</groupId> <artifactId>sysout-over-slf4j</artifactId> <version>1.0.2</version> </dependency> ``` 第二步:在应用程序启动时初始化重定向 在main方法的开始处,添加: ```java import uk.org.lidalia.sysoutslf4j.context.SysOutOverSLF4J; public class Main { public static void main(String[] args) { SysOutOverSLF4J.sendSystemOutAndErrToSLF4J(); // ... 其他代码 } } ``` 第三步:配置SLF4J的日志输出控制台(以Logback为例) 在logback.xml中,确保有一个控制台输出的appender,并且root logger使用了这个appender。例如: ```xml <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration> ``` 这样,原本通过System.out.println输出的内容会被重定向到SLF4J,然后由Logback以日志的形式输出控制台。注意,这些输出会被记录为INFO级别(默认情况下,但可以通过配置修改)。 但是,请注意:重定向后,System.out的打印会变成日志记录,因此会受到日志级别控制。例如,如果root logger的级别设置为ERROR,那么System.out的打印将不会输出。所以,我们需要确保日志级别至少为INFO(因为重定向后,System.out的打印被记录为INFO级别)。 另外,引用[4]中提到的网址(http://projects.lidalia.org.uk/sysout-over-slf4j/quickstart.html)提供了更详细的配置说明。 如果用户只是希望SLF4J的日志输出控制台,那么通常不需要重定向System.out,因为默认情况下日志就会输出控制台。所以,我们假设用户是希望将System.out的内容也纳入日志系统。 因此,我们按照上述步骤配置即可。 注意:在初始化重定向之后,不能再使用System.out.println,否则会导致循环调用(因为System.out已经被重定向到SLF4J,而SLF4J的ConsoleAppender又会使用System.out)。但是,`sysout-over-slf4j`已经处理了这个问题,它不会将SLF4J的日志输出再次重定向,从而避免了循环。 如果用户使用的是其他日志框架(如Log4j2),配置方式类似,只需确保有一个控制台appender即可。 相关问题: 1. 如何避免重定向System.out后导致的日志循环? 2. 除了使用sysout-over-slf4j,还有其他方法将System.out重定向到日志框架吗? 3. 如何修改重定向后System.out输出的日志级别?</think>### 如何配置 SLF4J 将 System.out 日志输出控制台 SLF4J 默认会将日志输出控制台(通过底层日志实现如 Logback/Log4j2),但若需将 `System.out.println()` 的内容也重定向到 SLF4J 控制台输出,需额外配置: #### 配置步骤 1. **添加依赖**(Maven 示例): ```xml <!-- SLF4J 核心 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <!-- Logback 实现(含控制台输出) --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> <!-- 重定向 System.out 到 SLF4J --> <dependency> <groupId>uk.org.lidalia</groupId> <artifactId>sysout-over-slf4j</artifactId> <version>1.0.2</version> </dependency> ``` 2. **初始化重定向**(在程序入口调用): ```java import uk.org.lidalia.sysoutslf4j.context.SysOutOverSLF4J; public class Main { public static void main(String[] args) { // 重定向 System.out/System.err 到 SLF4J SysOutOverSLF4J.sendSystemOutAndErrToSLF4J(); // 后续代码... System.out.println("此消息将通过 SLF4J 输出控制台"); } } ``` 3. **配置 Logback 控制台输出**(`logback.xml`): ```xml <configuration> <!-- 控制台 Appender --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 根日志级别设为 INFO 并指向控制台 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration> ``` #### 关键说明 - **重定向原理**:`sysout-over-slf4j` 会将 `System.out` 替换为 SLF4J 的代理,所有 `println()` 调用转为 `logger.info()` 输出[^4]。 - **日志级别**:重定向后的 `System.out` 默认以 **INFO 级别**输出。 - **避免循环调用**:该库已处理 SLF4J 自身日志与 `System.out` 的循环依赖问题[^4]。 - **默认行为**:SLF4J 绑定 Logback 后,不额外配置也会输出控制台,但 `System.out` 需主动重定向。 #### 验证结果 运行程序后,所有 `System.out.println()` 输出将按 Logback 格式显示在控制台,例如: ``` 2023-05-10 14:30:22 [main] INFO System.out - 此消息将通过 SLF4J 输出控制台 ``` --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值