cmd控制台中文乱码!在IDE中是正确的,导出程序后就不行了。如下:

yyxgs 2018-05-09 05:25:35
我有一个文件,它的编码是UTF-8


使用eclipse编写的java代码截取文件中的信息,结果是理想的:


但是用eclipse导出jar后, 在控制台下运行, 就成乱码了


使用chcp 65001和修改注册表,仍然没有是乱码:


请问各位大神,这个该怎么解决?
...全文
1080 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyxgs 2018-05-11
  • 打赏
  • 举报
回复
引用 25 楼 dgqjava 的回复:
[quote=引用 24 楼 yyxgs 的回复:] [quote=引用 22 楼 dgqjava 的回复:] [quote=引用 21 楼 yyxgs 的回复:] [quote=引用 18 楼 dgqjava 的回复:] [quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] 代码在19楼[/quote]ReadData.readData这个方法的代码有问题[/quote]
	/**
	 * 读取文件中所有的数据
	 * @param path 文件路径
	 * @return 返回 ArrayList<String> 变量
	 * @exception 如果文件路径非法, 返回null 
	 */
	public static ArrayList<StringBuffer> readData(StringBuffer path) {
		// 检测文件是否存在
		if (FindFile.isExists(path) == false) {
			return null;
		}
		
		ArrayList<StringBuffer> data = new ArrayList<StringBuffer>(); /*储存读取的文件数据*/

		File file = new File(path.toString());
		BufferedReader fr = null;
		
		try {
			fr = new BufferedReader(new FileReader(file));
		}
		catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}

		String line = "";
		for (;;) {
			try {
				line = fr.readLine(); //读取一行数据
			}
			catch (IOException e) {
				e.printStackTrace();
			}
			
			if (line == null) {
				break; //结束读取
			} 
			else {
				data.add(new StringBuffer(line)); //记录到data变量里
			}
		}

		try {
			fr.close(); //关闭文件
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		return data;
	}
[/quote] 19行改为new String(Files.readAllBytes(file.toPath), StandardCharsets.UTF_8)直接就可以读取, 或者改成fr = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))[/quote] 真的成功了!感谢!
dgqjava 2018-05-11
  • 打赏
  • 举报
回复
引用 24 楼 yyxgs 的回复:
[quote=引用 22 楼 dgqjava 的回复:] [quote=引用 21 楼 yyxgs 的回复:] [quote=引用 18 楼 dgqjava 的回复:] [quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] 代码在19楼[/quote]ReadData.readData这个方法的代码有问题[/quote]
	/**
	 * 读取文件中所有的数据
	 * @param path 文件路径
	 * @return 返回 ArrayList<String> 变量
	 * @exception 如果文件路径非法, 返回null 
	 */
	public static ArrayList<StringBuffer> readData(StringBuffer path) {
		// 检测文件是否存在
		if (FindFile.isExists(path) == false) {
			return null;
		}
		
		ArrayList<StringBuffer> data = new ArrayList<StringBuffer>(); /*储存读取的文件数据*/

		File file = new File(path.toString());
		BufferedReader fr = null;
		
		try {
			fr = new BufferedReader(new FileReader(file));
		}
		catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}

		String line = "";
		for (;;) {
			try {
				line = fr.readLine(); //读取一行数据
			}
			catch (IOException e) {
				e.printStackTrace();
			}
			
			if (line == null) {
				break; //结束读取
			} 
			else {
				data.add(new StringBuffer(line)); //记录到data变量里
			}
		}

		try {
			fr.close(); //关闭文件
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		return data;
	}
[/quote] 19行改为new String(Files.readAllBytes(file.toPath), StandardCharsets.UTF_8)直接就可以读取, 或者改成fr = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))
yyxgs 2018-05-11
  • 打赏
  • 举报
回复
引用 22 楼 dgqjava 的回复:
[quote=引用 21 楼 yyxgs 的回复:] [quote=引用 18 楼 dgqjava 的回复:] [quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] 代码在19楼[/quote]ReadData.readData这个方法的代码有问题[/quote]
	/**
	 * 读取文件中所有的数据
	 * @param path 文件路径
	 * @return 返回 ArrayList<String> 变量
	 * @exception 如果文件路径非法, 返回null 
	 */
	public static ArrayList<StringBuffer> readData(StringBuffer path) {
		// 检测文件是否存在
		if (FindFile.isExists(path) == false) {
			return null;
		}
		
		ArrayList<StringBuffer> data = new ArrayList<StringBuffer>(); /*储存读取的文件数据*/

		File file = new File(path.toString());
		BufferedReader fr = null;
		
		try {
			fr = new BufferedReader(new FileReader(file));
		}
		catch (FileNotFoundException e) {
			e.printStackTrace();
			return null;
		}

		String line = "";
		for (;;) {
			try {
				line = fr.readLine(); //读取一行数据
			}
			catch (IOException e) {
				e.printStackTrace();
			}
			
			if (line == null) {
				break; //结束读取
			} 
			else {
				data.add(new StringBuffer(line)); //记录到data变量里
			}
		}

		try {
			fr.close(); //关闭文件
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		return data;
	}
yyxgs 2018-05-11
  • 打赏
  • 举报
回复
引用 22 楼 dgqjava 的回复:
[quote=引用 21 楼 yyxgs 的回复:] [quote=引用 18 楼 dgqjava 的回复:] [quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] 代码在19楼[/quote]ReadData.readData这个方法的代码有问题[/quote] 这是readData()方法的实现代码: [code=java][/ /** * 读取文件中所有的数据 * @param path 文件路径 * @return 返回 ArrayList<String> 变量 * @exception 如果文件路径非法, 返回null */ public static ArrayList<StringBuffer> readData(StringBuffer path) { // 检测文件是否存在 if (FindFile.isExists(path) == false) { return null; } ArrayList<StringBuffer> data = new ArrayList<StringBuffer>(); /*储存读取的文件数据*/ File file = new File(path.toString()); BufferedReader fr = null; try { fr = new BufferedReader(new FileReader(file)); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } String line = ""; for (;;) { try { line = fr.readLine(); //读取一行数据 } catch (IOException e) { e.printStackTrace(); } if (line == null) { break; //结束读取 } else { data.add(new StringBuffer(line)); //记录到data变量里 } } try { fr.close(); //关闭文件 } catch (IOException e) { e.printStackTrace(); } return data; }code]
dgqjava 2018-05-11
  • 打赏
  • 举报
回复
引用 21 楼 yyxgs 的回复:
[quote=引用 18 楼 dgqjava 的回复:] [quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] 代码在19楼[/quote]ReadData.readData这个方法的代码有问题
yyxgs 2018-05-11
  • 打赏
  • 举报
回复
引用 18 楼 dgqjava 的回复:
[quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] -------------------------------------------------- 这是我UC浏览器的历史记录界面 我把这个页面保存下来 在eclipse中,打印结果是正确的 但在控制台下,就成了乱码 然后我把文件的编码改成了ANSI 打印结果就正确了
yyxgs 2018-05-11
  • 打赏
  • 举报
回复
引用 18 楼 dgqjava 的回复:
[quote=引用 16 楼 yyxgs 的回复:] [quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码[/quote] 代码在19楼
yyxgs 2018-05-11
  • 打赏
  • 举报
回复
public class Test {
	
	public static void main(String[] args) throws Exception {
		StringBuffer path = Conver.nsb("c:/下载/历史记录.html");
		StringBuffer fileName = Conver.nsb("c:/下载/UC浏览器历史记录.txt");
		
		// 如果html文件存在, 更改文件名
		if (FindFile.isExists(path) == true) {
			FilePath.rename(path, fileName);
		}
		else {
			// 如果txt文件也不存在, 输出错误
			if (FindFile.isExists(fileName) == false) {
				System.out.println("\n文件名更改失败!\n");
				System.exit(1);
			}
		}
		
		// 将路径保存在path里
		path = fileName;
		fileName = null;
		
		// 读取文件
		ArrayList<StringBuffer> fileData = ReadData.readData(path);
		if (fileData == null) {
			System.out.println("\n读取失败!\n");
			System.exit(1);
		}
		
		ArrayList<StringBuffer> temp = null;
		for (int i = 0;i < fileData.size();++i) {
			// 截取 title=" 到 "> 之间的字符串
			temp = SubStr.separateBetweenStr(fileData.get(i), Conver.nsb("title=\""), Conver.nsb("\">"));
			if (temp == null) {
				continue;
			}
			
			for (int j = 0;j < temp.size();++j) {
				// 如果引用为null, 或者是 "删除" 和 "搜索相关的记录" 则过滤, 不显示
				if (temp.get(j) == null || ComStr.compare(temp.get(j), "删除") == true || ComStr.compare(temp.get(j), "搜索相关的记录") == true) {
					continue;
				}
				
				// 显示字符串
				System.out.println(temp.get(j));
			}
		}
	}
}
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
代码贴出来看
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
你的代码写的有问题
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]把你的代码拿出来改一下执行就知道了 你的代码在eclipse里删掉的 选中原先代码所在的项目 右键 restore from local history就能看到IDE缓存的历史版本 里面能找到你删掉的代码
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
引用 16 楼 yyxgs 的回复:
[quote=引用 13 楼 dgqjava 的回复:] [quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用[/quote]和你控制台的编码没关系 你的代码里读取了UTF-8的文本文件 然后用默认的GBK进行了编码 这一步就导致了乱码
yyxgs 2018-05-10
  • 打赏
  • 举报
回复
引用 13 楼 dgqjava 的回复:
[quote=引用 12 楼 u012175637 的回复:] cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码[/quote] 但是我用注册表把控制台的编码改成了UTF-8还是没用
yyxgs 2018-05-10
  • 打赏
  • 举报
回复
引用 12 楼 u012175637 的回复:
cmd 的默认编码格式是什么?
默认是936,改为了65001,也就是UTF-8,但还是没用(注册表)
yyxgs 2018-05-10
  • 打赏
  • 举报
回复
引用 11 楼 dgqjava 的回复:
[quote=引用 9 楼 yyxgs 的回复:] [quote=引用 8 楼 dgqjava 的回复:] 代码贴出来看
代码删都删了。。不过代码肯定是没有问题的,因为我把文件的编码改为ANSI后,就正常了。 我想知道的是,除了修改文件的编码,还有没有其他办法。[/quote]你改为ANSI之后不乱码就是因为你的代码有问题 eclipse中启动的jvm默认编码是utf-8 而你在windows里用命令启动会是使用平台默认编码也就是ANSI 中文版的windows也就是中文编码 你的代码里转码没指定utf-8就后用默认编码 默认编码在eclipse中就是utf-8所以没问题 在windows命令启动就乱码 我找了几个你里面的乱码 通过GBK还原为UTF-8之后就不乱码了 证明结果和我的猜想一致 System.out.println(new String("鍦颁骇".getBytes("GBK"), "UTF-8"));// 这句代码从你的乱码里选了几个字还原出来就是中文"地产" 你之所以找不到问题的所在 就是问题超出了你的能力范围 所以这个时候你就不应该说肯定什么是没问题的 因为问题就出在你想不到的地方 要不然你就不会来问这个问题了[/quote] 我代码里并没有转换编码的功能
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
引用 12 楼 u012175637 的回复:
cmd 的默认编码格式是什么?
System.out.println(Charset.defaultCharset());用这句代码分别在eclipse和cmd里面执行就知道了 默认编码不一样 你代码不强制指定编码环境不一样就乱码
youyouru 2018-05-10
  • 打赏
  • 举报
回复
cmd 的默认编码格式是什么?
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
引用 9 楼 yyxgs 的回复:
[quote=引用 8 楼 dgqjava 的回复:] 代码贴出来看
代码删都删了。。不过代码肯定是没有问题的,因为我把文件的编码改为ANSI后,就正常了。 我想知道的是,除了修改文件的编码,还有没有其他办法。[/quote]你改为ANSI之后不乱码就是因为你的代码有问题 eclipse中启动的jvm默认编码是utf-8 而你在windows里用命令启动会是使用平台默认编码也就是ANSI 中文版的windows也就是中文编码 你的代码里转码没指定utf-8就后用默认编码 默认编码在eclipse中就是utf-8所以没问题 在windows命令启动就乱码 我找了几个你里面的乱码 通过GBK还原为UTF-8之后就不乱码了 证明结果和我的猜想一致 System.out.println(new String("鍦颁骇".getBytes("GBK"), "UTF-8"));// 这句代码从你的乱码里选了几个字还原出来就是中文"地产" 你之所以找不到问题的所在 就是问题超出了你的能力范围 所以这个时候你就不应该说肯定什么是没问题的 因为问题就出在你想不到的地方 要不然你就不会来问这个问题了
yyxgs 2018-05-10
  • 打赏
  • 举报
回复
引用 5 楼 txwh_2169 的回复:
编码不同必然乱码,转码是必需的。要么你就改变控制台的文本输出编码
控制台改了没用
赵4老师 2018-05-10
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
加载更多回复(6)

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧