Java自动生成bat的换行和乱码问题

想用java自动创建Windows中的bat批处理文件,但是遇到了换行和中文乱码问题,记录如下:

参考:Java写到.txt文件,如何实现换行 - huiyi789

  • windows下的文本文件换行符:\r\n (一定是\r在前,\n在后)
  • linux/unix下的文本文件换行符:\r
  • Mac下的文本文件换行符:\n

参考:关于换行符 - tonygao

  • 在正则表达式中,有一个\n是newline的意思,又有一个\r是carriage return(就是这个导致了白痴中文翻译"回车")的意思
  • 在处理String或者console输出的时候,无论带上哪个都能换行。
  • 但是偏偏在txt中,哪个都不是标准的换行,只有合起来的\r\n才是换行(对于整个windows默认的换行来说,都是这样)。
  • 意思是\r敲个回车,表明这行结束了,光标回到头去,然后再\n下移一行来个新行。


java中使用不同字符编码的效果记录:

  手动创建编写Bat文件时,将该bat文件以 ANSI 1 编码进行保存,则能正常地在所有文本编辑软件中正常查看,运行时也不会出现中文乱码。但java中无法设置ANSI编码,于是尝试了utf-8和GBK编码,效果如下:

   java以不同编码的输出流将中文写入到bat文件中的效果

编码 Windows记事本打开是否乱码 notepad++打开是否乱码 EditPlus打开是否乱码 运行该Bat文件是否显示乱码
utf-8 乱码
GBK 乱码 乱码
  • 因为最终要运行bat文件,CMD中需要有中文查看运行日志,所以不能使用uft-8。
  • 而GBK编码下,记事本软件不乱码,能正常查看中文,notepad++软件更改为以gb2312编码读取文本后,也能正常查看中文。所以决定使用GBK编码。
  • notepad++软件更改为以gb2312编码读取文本(仅以gb2312编码读取,不以gb2312编码保存):菜单栏 ==> 编码 ==> 编码字符集 ==> 中文 ==> GB2312(simplified)

  测试代码如下:

	public static void main(String[] args) throws IOException {
		File file = new File("D:/test.bat");
		//创建输出流
        OutputStreamWriter ows = null;
        try {
            ows = new OutputStreamWriter(new FileOutputStream(file),"utf-8");//此处更换不同编码进行测试
        } catch (UnsupportedEncodingException e) {
            System.err.println("编码设置错误,请检查编码名称的拼写及大小写。");
            e.printStackTrace();
            return ;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return ;
        }

		//写入到文件
        try {
            ows.write("@echo 测试CMD中能否正常显示中文。");//cmd中“@echo”用于回显打印字符
            ows.write("\r\n");//windows下的文本软件使用“\r\n”来表示换行
            ows.write("@echo This is the second line.");
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

		//清空输出流缓存 及 关闭输出流
        try {
            ows.flush();
            ows.close();
        } catch (IOException e) {
            return;
        }
	}

  1. ASNI:不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。 来源 -百度百科 ↩︎

你可能感兴趣的:(Java,web)