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

介绍

在命令行模式下执行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.mzph.cn/news/10062.shtml

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

相关文章

Seaborn库绘制单变量分布和双变量分布

Matplotlib虽然已经是比较优秀的绘图库了,但是它有个今人头疼的问题,那就是API使用过于复杂,它里面有上千个函数和参数,属于典型的那种可以用它做任何事,却无从下手。 Seaborn基于 Matplotlib核心库进行了更高级的API…

python与深度学习(五):CNN和手写数字识别

目录 1. 说明2. 卷积运算3. 填充4. 池化5. 卷积神经网络实战-手写数字识别的CNN模型5.1 导入相关库5.2 加载数据5.3 数据预处理5.4 数据处理5.5 构建网络模型5.6 模型编译5.7 模型训练、保存和评价5.8 模型测试5.9 模型训练结果的可视化 6. 手写数字识别的CNN模型可视化结果图7…

LeetCode面向运气之Javascript—第2600题-K件物品的最大和-94.68%

LeetCode第2600题-K件物品的最大和 题目要求 袋子中装有一些物品,每个物品上都标记着数字 1 、0 或 -1 。 四个非负整数 numOnes 、numZeros 、numNegOnes 和 k 。 袋子最初包含: numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。numNegOn…

12 扩展Spring MVC

✔ 12.1 实现页面跳转功能 页面跳转功能:访问localhost:8081/jiang会自动跳转到另一个页面。 首先,在config包下创建一个名为MyMvcConfig的配置类: 类上加入Configuration注解,类实现WebMvcConfiger接口,实现里面的视…

【学习心得】sublime text 4 自定义编译系统

一、问题描述 在电脑中有多个版本的Python解释器,而sublime默认选择最新版本的解释器,如何指定自己想要的解释器呢? 二、自定义编译系统 1、选择新建编译系统(如图) 2、重写两个键值对(只修改中文部分其…

【Hive 01】简介、安装部署、高级函数使用

1 Hive简介 1.1 Hive系统架构 Hive是建立在 Hadoop上的数据仓库基础构架,它提供了一系列的工具,可以进行数据提取、转化、加载( ETL )Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户直接查询…

【《机器学习和深度学习:原理、算法、实战(使用Python和TensorFlow)》——以机器学习理论为基础并包含其在工业界的实践的一本书】

机器学习和深度学习已经成为从业人员在人工智能时代必备的技术,被广泛应用于图像识别、自然语言理解、推荐系统、语音识别等多个领域,并取得了丰硕的成果。目前,很多高校的人工智能、软件工程、计算机应用等专业均已开设了机器学习和深度学习…

OBS 迁移--华为云

一、创建迁移i任务 1. 登录管理控制台。 2. 单击管理控制台左上角的 在下拉框中选择区域。 3. 单击“ 服务列表 ”,选择“ 迁移 > 对象存储迁移服务 OMS ”,进入“ 对象存储迁移服务 ”页面。 4. 单击页面右上角“ 创建迁移任务 ”。 5. 仔细阅读…

el-upload上传图片和视频,支持预览和删除

话不多说&#xff0c; 直接上代码&#xff1a; 视图层&#xff1a; <div class"contentDetail"><div class"contentItem"><div style"margin-top:5px;" class"label csAttachment">客服上传图片:</div><el…

iOS--KVO和KVC

KVC 简单介绍 KVC的全称是KeyValueCoding&#xff0c;俗称“键值编码”&#xff0c;可以通过一个key来访问某个属性&#xff1b; KVC提供了一种间接访问其属性方法或成员变量的机制&#xff0c;可以通过字符串来访问对应的属性方法或成员变量&#xff1b; 它是一个非正式的…

大数据课程C4——ZooKeeper结构运行机制

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Zookeeper的特点和节点信息&#xff1b; ⚪ 掌握Zookeeper的完全分布式安装 ⚪ 掌握Zookeeper的选举机制、ZAB协议、AVRO&#xff1b; 一、Zookeeper-简介 1. 特点…

vue build 打包遇到bug解决记录

文章目录 vue-cli-service servevue打包修改dist文件夹名字vue build require is not defined 和 exports is not defind 错误 vue-cli-service serve 通常vue是不能直接使用vue-cli-service命令在终端运行的&#xff0c;所以才会在package.json中配置了scripts&#xff1a; …

JDBC的的使用

首先导入jar包。 https://downloads.mysql.com/archives/c-j/ package com.test.sql;import java.sql.*;public class StudySql {public static void init() throws SQLException {Statement stmt null;Connection conn null;ResultSet res null;PreparedStatement pstm…

自动化运维工具—Ansible概述

Ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、…

CTFshow web入门 爆破

web21 bp 攻击模块的迭代器 输入账号密码 抓包 发现下面存在一个base64编码 我输入的是 123 123 发现就是base加密 账号 密码 那我们怎么通过intruder模块 自动变为 base64呢 然后去payload------>custom iterator(自定义迭代器) 位置1导入admin 因为是 账号:密码 这…

微服务远程调用openFeign简单回顾(内附源码示例)

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

win 安装虚拟机 再安装macos

0 视频教程 windows虚拟机一键安装苹果系统macos&#xff0c;轻松拥有xcode环境_哔哩哔哩_bilibili在windows环境下vmware虚拟机一键安装macos Catalina10.15.7苹果系统&#xff0c;帮助学习ios编程的朋友们实现xcode环境。文字教程&#xff1a;https://www.dhzy.fun/archives…

Prometheus 的应用服务发现及黑河部署等

目录 promtool检查语法 部署Prometheus Server 检查语法是否规范 部署node-exporter 部署Consul 直接请求API进行服务注册 使用register命令注册服务&#xff08;建议使用&#xff09; 单个和多个注册&#xff0c;多个后面多加了s 在Prometheus上做consul的服务发现 部署…

IL汇编字符串连接

在此实现了一个基本的IL汇编程序&#xff1b; 了解MSIL汇编和IL汇编评估堆栈_bcbobo21cn的博客-CSDN博客 它用了下面两句来在屏幕输出字符串&#xff0c; ldstr "I am from the IL Assembly Language..." call void [mscorlib]System.Console::WriteLine (string) …

用i18next使你的应用国际化-React

ref: https://www.i18next.com/ i18next是一个用JavaScript编写的国际化框架。 i18next为您提供了一个完整的解决方案&#xff0c;本地化您的产品从web端到移动端和桌面端。 在react项目中安i18next依赖&#xff1a; i18nextreact-i18nexti18next-browser-languagedetector&…