在命令行模式、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窗口,可以输入“中”,输出结果正确:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat修改端口号

网上的教程都比较老,今天用tomcat9.0记录一下 conf文件夹下server.xml文件 刚开始改了打红叉的地方,发现没用,改了上面那行

【爬虫逆向案例】某道翻译js逆向—— sign解密

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 【爬虫逆向案例】某道翻译js逆向—— sign解密 1、前言2、步骤3、源码4、号外 1、前言 相信各位小伙伴在写…

Unity Shader - if 和 keyword 的指令比较

文章目录 环境TestingIf4Sampleunity shaderlab 中的 TestingIf4Sample.shadergraphics analyzer 中的 TestingIf4Sample.glsl TestingKW4Sampleunity shaderlab 中的 TestingKW4Sample.shadergraphics analyzer 中的 TestingKW4Sample.glsl 比较 环境 Unity : 2020.3.37f1 Pi…

如何测试Linux内核

目录 概述 LTP 构建系统 C测试用例 参考资料 Autotest Kmemleak Kmemcheck Linaro LAVA 调试器 GDB KGDB 设备驱动测试 资料获取方法 概述 在本文中,我们将讨论用于测试Linux内核的各种框架和工具。首先,我们将介绍LTP( Linux Test Proje…

幸福长寿的秘诀 —— 查理芒格

查理芒格:幸福长寿的秘诀其实很简单。_哔哩哔哩_bilibili People trying to figure out what the secret to life, is to a long and happy life ? Its simple. You dont have a lot of envy. You dont have a lot of resentment. You dont overspend your incom…

安全DNS,状态码,编码笔记整理

一 DNS DNS(Domain Name System)是互联网中用于将域名转换为IP地址的系统。 DNS的主要功能包括以下几个方面: 域名解析:DNS最主要的功能是将用户输入的域名解析为对应的IP地址。当用户在浏览器中输入一个域名时,操作…

PostgreSQL-Character with value 0x09 must be escaped.

在使用json相关函数时,报了这个错: Character with value 0x09 must be escaped.中文即使:值为0x09的字符必须转义。 找了下这个0x09 这个ASCII的值,是水平制表符。那这应该是因为json不支持换行导致的,我们将水平制…

海尔设计借助亚马逊云科技生成式AI,实现端到端的云上工业设计解决方案

海尔创新设计中心(以下简称海尔设计)成立于1994年,目前拥有400多名设计师,为海尔智家旗下七大品牌全球的所有产品提供设计创新和模式探索。亚马逊云科技为海尔设计提供了四个完整的云上解决方案,全面替代自有机房&…

pytorch学习-线性神经网络——softmax回归+损失函数+图片分类数据集

1.softmax回归 Softmax回归(Softmax Regression)是一种常见的多分类模型,可以用于将输入变量映射到多个类别的概率分布中。softmax回归是机器学习中非常重要并且经典的模型,虽然叫回归,实际上是一个分类问题 1.1分类与…

管理类联考——写作——素材篇——论说文——人工智能

有人说,机器人的使命应该是帮助人类做那些人类做不了的事情,而不是替代人类。技术变革会夺取一些人低端繁琐的工作岗位,最终也会创造更高端更人性化的工作机会。例如,铁路的出现抢去了很多挑夫的工作,但也增加了千百万…

Vue 常用指令 v-for 列表循环

v-for:根据数据生成列表结构,并且是响应式的,可以十分便捷的操作列表结构了。 至于是什么样的列表,就看你指令使用的位置了,列表的生成依赖于数据,所以先去定义数据。 它结合的类型挺多的,数组…

存储重启后,ceph挂载信息没了,手动定位osd序号并挂载到对应磁盘操作流程、ceph查看不到osd信息处理方法

文章目录 故障说明处理流程定位硬盘中的osd序号挂载osd到ceph上验证并拉起osd重复上面操作故障说明 我们的一个存储节点莫名其妙的重启了,不知道咋回事 但这样的问题就是,所有osd都down了 因为挂载信息没有写到fstab里面,所以不会自动up,并且没有挂载信息,并且也看不到o…

如何进行SQL优化

一、SQL优化的主要步骤 在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生…

用友NC65登录界面的jsp页面路径

如上图,访问地址 http://127.0.0.1/portal/app/mockapp/login.jsp?lrid=1对应的页面是哪个呢??相信很多做用友portal端开发的人可能都没有研究或者思考过这个问题,或者想过,但是不知道路径在哪里。你直接按地址栏的地址查,发现nchome里,并没有”portal/app/mockapp/“这…

Vue3学习组合式API(二)

1、计算属性compute <script setup> //导入 import {ref, computed } from vue const state ref(0) //原始数据 const count ref(1); //计算属性 const doubleCount computed(()>count.value*2);//原始数据 const list ref([1,2,3,4,5,6,7,8]); //list属性值 con…

ES6基础知识四:对象新增了哪些扩展?

一、参数 ES6允许为函数的参数设置默认值 function log(x, y World) {console.log(x, y); }console.log(Hello) // Hello World console.log(Hello, China) // Hello China console.log(Hello, ) // Hello函数的形参是默认声明的&#xff0c;不能使用let或const再次声明 fu…

Linux操作系统~必考面试题⑧

1、pwd 命令 pwd 命令用于查看当前工作目录路径。 实例&#xff1a; 查看当前路径 pwd 查看软链接的实际路径 pwd -P 2、rmdir 命令 从一个目录中删除一个或多个子目录项&#xff0c;删除某目录时也必须具有对其父目录的写权限。 注意&#xff1a;不能删除非空目录实例&…

剑指offer12 矩阵中的路径 13 机器人的运动范围 34.二叉树中和为某一值得路径

class Solution { public:bool exist(vector<vector<char>>& board, string word) {int rowboard.size(),colboard[0].size();int index0,i0,j0;if(word.size()>row*col) return 0;//vector<vector<int>> visit[row][col];//标记当前位置有没有…

SQL AND OR 运算符

AND & OR 运算符用于基于一个以上的条件对记录进行过滤。 如果第一个条件和第二个条件都成立&#xff0c;则 AND 运算符显示一条记录。 如果第一个条件和第二个条件中只要有一个成立&#xff0c;则 OR 运算符显示一条记录。 下面是选自 "students" 表的数据&a…

Linux为何是软件开发专业人员的心头爱-Robotics Ubuntu

Linux与Windows都是十分常见的电脑操作系统&#xff0c;相信你对它们二者都有所了解&#xff01;在你的使用过程中&#xff0c;是否有什么事让你觉得在Linux上顺理成章&#xff0c;换到Windows上就令你费解&#xff1f;亦或者关于这二者你有任何想要分享的&#xff0c;都可以在…