在命令行模式、eclipse console下执行Java程序输入中文的几种情况尝试

news2024/11/26 20:38:19

介绍

在命令行模式下执行Java程序,如果输入中文,经常会出现和代码中的解码字符集不匹配的情况,导致结果不正确。
在命令行模式下执行Java程序,输入中文,其实是用某种字符集编码成字节流,Java程序读取该字节流,然后用某种字符集解码为字符。这个编码和解码的字符集要相同,才能正确。

看下面这段代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("GBK"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

代码中的System.in是java.io.InputStream类型,代表了输入的字节流(此时还没有解码)。
java.io.InputStreamReader这个类可以完成从字节流到字符的解码过程。创建InputStreamReader实例的时候可以指定解码的字符集,如果没有指定,就用默认的字符集。
我就遇到了GBK、UTF-8情况下命令行输入和代码中解码的几种情况,摸索了好几个小时。把我尝试的几种情况(正确的、不正确)记录下来,方便后面查看。
java.io.InputStreamReader.read()返回值是一个整数,表示解码后字符对应的Unicode码点。

我们以中文的“中”字为例,它的码点是用十六进制表示是4e2d,这样后面的各种组合输出的结果跟这个对比下,就能看出来输出是否正确。

场景举例

cmd窗口下,编码是GBK;程序中解码是GBK

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("GBK"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

在cmd窗口中用chcp命令查看当前的编码是936,是GBK编码:
在这里插入图片描述
执行Java程序,在窗口中输入“中”,输出结果正确:
在这里插入图片描述

cmd窗口下,编码是GBK;程序中解码是UTF-8

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("UTF-8"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

在cmd窗口中用chcp命令查看当前的编码是936,是GBK编码:
在这里插入图片描述

执行Java程序,在窗口中输入“中”,输出结果错误:
在这里插入图片描述

cmd窗口下,编码是UTF-8;程序中解码是UTF-8

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("UTF-8"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

在cmd窗口中用chcp 65001将当前窗口编码切换为UTF-8:
在这里插入图片描述

在这里插入图片描述
执行Java程序,在窗口中尝试,没有办法切换到中文输入法,也就没有办法直接输入“中”,只好从其它地方拷贝一个“中”字过来作为输入,但输出结果错误(这应该是shell处理的问题):
在这里插入图片描述

在PowerShell 7.2.4尝试了cmd情况下的各种情况,结果跟cmd中得到的结果一样

在Git Bash窗口下,编码是GBK;程序中解码是GBK

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("GBK"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

更改Git Bash窗口的Options->Text,将字符集切换为GBK:
在这里插入图片描述

在Git Bash窗口下执行java程序,可以输入“中”,输出结果正确:
在这里插入图片描述

Git Bash窗口下,编码是UTF-8;程序中解码是UTF-8

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("UTF-8"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

更改Git Bash窗口的Options->Text,将字符集切换为UTF-8:
在这里插入图片描述

在Git Bash窗口下执行java程序,可以输入“中”,输出结果正确:
在这里插入图片描述

在eclipse中执行,输入窗口编码是GBK;程序中解码是GBK

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("GBK"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

右键单击Java工程,选择Run As->Run Configurations:
在这里插入图片描述
在出现的窗口中选择Common这个tab页,编码选择GBK:
在这里插入图片描述

在eclipse的Console窗口,可以输入“中”,输出结果正确:
在这里插入图片描述

在eclipse中执行,输入窗口编码是UTF-8;程序中解码是UTF-8

代码:

package com.thb;

import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test1 {
		
	public static void main(String[] args) {	
		InputStreamReader is = new InputStreamReader(System.in, Charset.forName("UTF-8"));		

		try {
			System.out.println(Integer.toHexString(is.read()));
		} catch (IOException e) {			
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {				
				e.printStackTrace();
			}
		}
		
	}
}

右键单击Java工程,选择Run As->Run Configurations:
在这里插入图片描述

在出现的窗口中选择Common这个tab页,编码选择UTF-8:
在这里插入图片描述

在eclipse的Console窗口,可以输入“中”,输出结果正确:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rk3588 双HDMI冲突问题与HDMI不能热插拔问题

问题一:HDMI不能热插拔问题 现象 rk3588在开发时现在发现只能在插入HDMI时上电才能输出信号,而当开机之后,再插入HDMI显示器则无信号。 分析 通过kernel显示,在开机后,插拔HMDI是有log提示的,说明内核能够检测到HDMI的插拔动作。 首先先排查软件问题,尝试重启显示进…

ssm项目配置,不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。

ssm项目启动报错&#xff1a; 不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本 1.模块语言级别 2.设置模块目标字节码版本 3.pom文件指定jdk版本 <properties><project.build.soutceEncoding>UTF-8</project.build.sout…

SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter

1. 自动配置流程 导入starter依赖导入autoconfigure寻找类路径下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件启动&#xff0c;加载所有 自动配置类 xxxAutoConfiguration 给容器中配置功能组件组件参数绑定到 属性类中。xxxPrope…

运维高级学习---MySQL主从复制

MySQL内建的复制功能是构建大型&#xff0c;高性能应用程序的基础 通过将MySQL的某一台主机 (master)的数据复制到其他主机(slaves)上&#xff0c;并重新执行一遍来执行复制过程中一台服务器充当主服务器&#xff0c;而其他一个或多个其他服务器充当从服务器 为什么要做主从复…

用eNSP搭建一个最简单的网络系统

要求搭建如下网络系统&#xff1a; 相关知识&#xff1a; 路由器命令界面&#xff1a; 所有的设备进入后均名字为Huawai&#xff1b; < >代表了当下所在的配置模式&#xff1b; 不同模式具有不同的管理权限&#xff0c;可以完成不同的配置要求&#xff1b; 第一级模式 …

Excel 端口操作指南

通过将 EDI 报文可视化为 Excel&#xff0c;企业可以更好地了解和处理数据&#xff0c;提高工作效率&#xff0c;减少错误率。在未实现 EDI 系统和内部业务系统集成之前&#xff0c;Excel 方案则是一项可供选择的临时替代方案。 Excel方案的优点在于&#xff0c;无需对业务系统…

【深度学习笔记】随机梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

Qt图片编辑 - 在直线添加文字

在绘制一条直线时&#xff0c;比如说在直线中间输出文字&#xff0c;如下图所示 本质上不难&#xff0c;定位到位置&#xff0c;然后drawText就可以了 难就难在 文字要跟随线的斜率&#xff0c;例如 还有&#xff0c;文字最好保证在线的“上方” 首先是角度问题 这个角度跟线…

C#WinForm获取当前活动子窗体使用鼠标滚轮事件改变窗体大小

获取当前活动子窗体使用鼠标滚轮事件改变窗体大小&#xff0c;实例在文末&#xff0c;可下载。 这个主要分三个重点 第一步 我们需要让子窗体显示在父窗体中 Form22 new Form2(); Form22.TopLevel false; // 不是顶级窗体 //Form22.Parent this;// 设置父窗体 一定不要…

索引使用——SQL提示、覆盖索引、回表查询

1. SQL提示 use index是给MySQL一个提示&#xff0c;在执行的时候尽量使用该索引&#xff0c;至于MySQL最后会不会接收该建议&#xff0c;则不一定。 ignore index是mysql忽略某个索引。 force index则强制mysql使用该索引。mysql别无选择。 2.覆盖索引 覆盖索引和回表查…

MQ消息介绍

1、同步通讯 立即发出&#xff0c;立即回复。 同步通讯过程中&#xff0c;若有消息失败&#xff0c;一直重试&#xff0c;会造成阻塞&#xff0c;影响其它功能。 优点&#xff1a;时效性高 2、异步通讯 3、什么是MQ 稳定性、可用性、并发性极为重要。 MQ&#xff1a;消息即…

RocketMQ教程-(4)-领域模型-消费者(Consumer)

本文介绍 Apache RocketMQ 中消费者&#xff08;Consumer&#xff09;的定义、模型关系、内部属性、行为约束、版本兼容性及使用建议。 定义​ 消费者是 Apache RocketMQ 中用来接收并处理消息的运行实体。 消费者通常被集成在业务系统中&#xff0c;从 Apache RocketMQ 服务…

钉钉和MySQL接口打通对接实战

钉钉和MySQL接口打通对接实战 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台&#xff0c;提供PC版&#xff0c;Web版和手机版&#xff0c;有考勤打卡、签到、审批、日志、公告、钉盘、钉邮等强大功能。 目标系统…

docker基础5——数据存储卷

文章目录 一、基本了解二、存储卷2.1 docker挂载卷2.2 绑定挂载卷2.3 设置容器挂在卷权限 三、数据卷容器四、数据卷容器迁移数据 一、基本了解 为什么会有存储卷&#xff1f; Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像…

【杂谈理解】STM32定时器启动模式

STM32定时器启动方式 前言 事情的起因本来是探究为什么在中断模式下的回调中函数中&#xff0c;我不小心加了延时函数为什么会导致崩溃&#xff0c;很遗憾啊&#xff0c;没看出来&#xff0c;不过需要在中断事件中延时的话&#xff0c;倒是可以用轮询模式下的配置。本文探究HA…

Aurix TC3xx系列MCU ADC采集时间计算方法(四)

文章目录 1 前言2 各阶段时间的计算方法2.1 计算公式2.2 采样阶段2.3 转换阶段2.4 降噪阶段2.5 校准阶段3 采集时间示例>>返回总目录<< 1 前言 在项目开发前期评估阶段,会比较关注ADC的采集时间,我们可以给出一个大概的采样的时间0.5us~1.2us左右,但是对于精确…

Python爬虫-贝壳二手房

前言 本文是该专栏的第3篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某二手房网为例,如下图所示,采集对应城市的二手房源数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly9zei5rZS5jb20vZXJzaG91ZmFuZy8= 目标:…

代理模式(java)

目录 结构 静态代理案例 代码实现 售票类 火车站类 代理类 测试类 优缺点 优点 缺点 结构 代理&#xff08;Proxy&#xff09;模式分为三种角色&#xff1a; 抽象主题&#xff08;Subject&#xff09;类&#xff1a; 通过接口或抽象类声明真实主题和代理对象实现的业务…

git cherry-pick 的使用

cherry-pick 精心挑选的意思&#xff0c;即可以从一个分支上挑选一个&#xff08;或多个&#xff09;修改&#xff0c;提交到当前分支上&#xff0c;不过 cherry-pick 只能是本地操作&#xff0c;即源分支上必须有的commit 才能 cherry-pick。遇到的情况可能是&#xff0c;源分…

JMeter的使用(2)

JMeter生成测试报告使用的是Ant(Maven)构建工具来生成HTML的测试报告。 ant执行的条件是需要有build.xml的文件的&#xff0c;build.xml文件里面主要编写三个内容&#xff1a; 1、定义了被执行的测试脚本 2、定义了测试报告的目录 3、定义了自动发送邮件 HTTP COOKIE管理器&am…