5分钟课堂:输入输出汉字乱码的解决方法

createh52个月前 (02-01)技术教程11

从JDK 19升级到JDK 21和22之后,之前示例程序出现键盘输入的汉字在程序处理时乱码。
具体现象:只要是键盘输入的汉字,不管是输出还是保存到文件,汉字都是乱码,而程序中的汉字字符串常量的输出和保存则没有问题。

非UTF-8格式的源文件编译错解决办法

Windows系统往往默认保存文本文件(包括源代码文件)格式为ANSI/GBK。

JDK 21起全面使用UTF-8作为字符编码,带有汉字注释的源代码如果是ANSI格式,则编译会出错:

javac WriteFile.java

WriteFile.java:9: 错误: 编码 UTF8 的不可映射字符 (0xC3)
      // ?????д??????????????GBK
         ^
WriteFile.java:9: 错误: 编码 UTF8 的不可映射字符 (0xFC)
      // ?????д??????????????GBK
          ^
WriteFile.java:9: 错误: 编码 UTF8 的不可映射字符 (0xC1)
      // ?????д??????????????GBK

解决办法:编译时选择指定字符编码为GBK

javac -encoding GBK WriteFile.java

或者使用文本编辑器程序将源文件另存为UTF-8格式保存后,直接编译也没有问题。

控制台输入输出汉字乱码解决办法

使用如下代码测试,直接输出汉字字符串常量没有问题,初步分析应该是输入处理的问题。

FileWriter fw =  new FileWriter(file);
PrintWriter out = new PrintWriter(fw);
out.println("测试汉字输出 by CHEN");

原来程序的键盘输入语句为:

String s;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while ((s = in.readLine()) != null) {
        out.println(s);
}

输出的文件除了测试的内容汉字正常,其他键盘输入的内容乱码。分析原因应该是命令行窗口默认字符编码为GBK,为了避免乱码,需要在转换处理流这里指定字符集编码为GBK。

修改代码指定字符集GBK:

BufferedReader in = new BufferedReader(
              new InputStreamReader(System.in,"GBK"));

再次测试,文件内容可正常保存汉字。

附完整测试程序代码:

import java.io.*;

public class WriteFile {
  public static void main (String args[]) {
    // Create file
    File file = new File(args[0]);

    try {
      // 命令行窗口默认字符编码为GBK
      //为了避免乱码,需要在转换处理流这里指定字符集编码为GBK
      BufferedReader in = new BufferedReader(
        new InputStreamReader(System.in,"GBK"));   
      
      //默认输出文件编码为UTF-8
      FileWriter fw =  new FileWriter(file);
      PrintWriter out = new PrintWriter(fw);
      out.println("测试汉字输出 by CHEN");
      
      System.out.print("Enter file text.  ");
      System.out.println("[Type cntl-z to stop.]");

      String s;
			// Read each input line and echo it to the screen.
      while ((s = in.readLine()) != null) {
        out.println(s);
      }

      // Close the buffered reader and the file print writer.
      in.close();
      out.close();

    } catch (IOException e) {
      // Catch any IO exceptions.
      e.printStackTrace();
    }
  }
}

相关文章

照着做!三步搞定Intellij IDEA中文乱码问题

关于JAVA IDE开发工具,Eclipse系列和Intelli IDEA是大部分公司的主要选择,从开发者的选择角度,Intellij IDEA似乎比Eclipse系列更受欢迎一些。当我们使用Inte...

IDEA中控制台输出是中文显示乱码(idea控制台中文输出是问号)

最近学习JAVA,作为一个新手小白,对编程的认知为0。跟随网上的教程学习,安装上IDEA工具后,每次输入语句中有中文时,只要执行就会显示乱码,太搞心态。问题如下图:作为小白,有问题肯定找度娘呀,可这次...

Servlet总结十三:程序乱码解决方案

乱码经常出现在什么位置数据保存过程中的乱码数据展示过程中的乱码数据传递过程中的乱码数据保存过程中的乱码数据保存到数据库表中的时候,数据出现乱码导致数据保存过程中的乱码包括以下两种情况:前一种情况:在保...

使用httpclient post请求中文乱码解决办法

【ps:本文为凯哥java实际工作中要到错误系列教程,在文章末尾会有本系列其他教程传送门】 概要:在使用httpclient发送post请求的时候,接收端中文乱码问题解决。正文:我们都知道,一般情况下...

# mysql 中文乱码问题分析(#mysql表中文乱码)

# mysql 中文乱码问题分析## 一、问题分析:MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集,如 latin1、utf8、utf8mb4 等,如果在创建数据库、数...

乱码是怎么产生的?一“文”打尽乱码问题

在我们处理文件或者处理程序字符时,时不时会遇到乱码的情况,而且这些乱码的情况让人很困惑,大多时候都是CV某度一下,看看有没有相关类似情况的博文出现,如果有那就按照博文上的方式一步一步去解决就好,如果没...