(一)JVM默认字符集——Charset.defaultCharset()

获取Java虚拟机默认字符集,该字符集默认跟操作系统字符集一致,也可以通过-Dfile.encoding="GBK" 来手动设定,但是在程序中通过setProperty方法直接设置并不能改变该方法的返回值。查看或修改操作系统默认字符集请参考下面2篇文章。

查看windows 系统字符集

如何查看和修改操作系统字符集

Java中,字符字节转换时,如果不提供字符集,使用默认字符集。例如,字符串和字节数组转换时,字节流和字符流转换时等。

 String str = "中文";
// 获取JVM默认字符集
System.out.println("defaultCharset:" + Charset.defaultCharset()); System.out.println("##字符串转换成byte数组");
byte[] defaultByteArray = str.getBytes();
byte[] gbkByteArray = str.getBytes("GBK");
byte[] utfByteArray = str.getBytes("UTF-8");
System.out.println("defaultByteArray:"
+ Arrays.toString(defaultByteArray));
System.out.println("gbkByteArray:" + Arrays.toString(gbkByteArray));
System.out.println("utfByteArray:" + Arrays.toString(utfByteArray)); System.out.println("##byte数组转换成字符串");
String defaultStr = new String(defaultByteArray);
String gbkStr = new String(defaultByteArray, "GBK");
String utfStr = new String(defaultByteArray, "UTF-8");
System.out.println("defaultStr:" + defaultStr);
System.out.println("gbkStr:" + gbkStr);
// 因为utf-8是变长编码,没有跟[-42, -48, -50, -60]对应的用utf-8字符集的字符串,所以会乱码
System.out.println("utfStr:" + utfStr); System.out.println("##字节流转化成字符流");
// 文件中只有“中文”2个字,文件采用“GBK”编码,共4个byte
BufferedReader defaultReader = new BufferedReader(
new InputStreamReader(new FileInputStream("src/encode.txt")));
BufferedReader gbkReader = new BufferedReader(new InputStreamReader(
new FileInputStream("src/encode.txt"), "GBK"));
BufferedReader utfReader = new BufferedReader(new InputStreamReader(
new FileInputStream("src/encode.txt"), "UTF-8"));
System.out.println("defaultReader:" + defaultReader.readLine());
System.out.println("gbkReader:" + gbkReader.readLine());
System.out.println("utfReader:" + utfReader.readLine()); System.out.println("##字符流转化成字节流");
BufferedWriter defaultWriter = new BufferedWriter(
new OutputStreamWriter(System.out));
BufferedWriter gbkWriter = new BufferedWriter(new OutputStreamWriter(
System.out, "GBK"));
BufferedWriter utfWriter = new BufferedWriter(new OutputStreamWriter(
System.out, "UTF-8"));
System.out.print("defaultWriter:");
defaultWriter.write(str);
// 这里不能用close()方法,否则System.out也被关闭,后续无输出
defaultWriter.flush();
System.out.print("\r\ngbkReader:");
gbkWriter.write(str);
gbkWriter.flush();
System.out.print("\r\nutfReader:");
utfWriter.write(str);
utfWriter.flush();

Java

defaultCharset:GBK
##字符串转换成byte数组
defaultByteArray:[-42, -48, -50, -60]
gbkByteArray:[-42, -48, -50, -60]
utfByteArray:[-28, -72, -83, -26, -106, -121]
##byte数组转换成字符串
defaultStr:中文
gbkStr:中文
utfStr:????
##字节流转化成字符流
defaultReader:中文
gbkReader:中文
utfReader:????
##字符流转化成字节流
defaultWriter:中文
gbkReader:中文
utfReader:涓枃

(二)Java程序入口文件(main函数所在文件)编码——System.getProperty("file.encoding")

该编码默认值取决于Java程序入口文件(main函数所在文件)编码的编码方式,具体请参考下面文章,也可以在运行Java程序时通过-Dfile.encoding="GBK" 来设定,如果-Dfile.encoding指定的编码方式跟Java程序入口文件的字符集不一致,将会导致乱码。也可以在程序中通过setProperty方法直接设置,这种设置虽然改变了“file.encoding”的值,但是似乎没什么用。

java 中关于System property 之 file.encoding

 System.out.println("##文件编码是GBK,-Dfile.encoding=\"GBK\"");
System.out.println("file.encoding:"
+ System.getProperty("file.encoding"));
// 在不存在的目录下创建文件,查看报错信息
try {
new File("directory/test.txt").createNewFile();
} catch (IOException e) {
e.printStackTrace();
} // ##文件编码是GBK,-Dfile.encoding="UTF-8"
System.out.println("##文件编码是GBK,-Dfile.encoding=\"UTF-8\"");
System.out.println("file.encoding:"
+ System.getProperty("file.encoding"));
// 在不存在的目录下创建文件,查看报错信息
try {
new File("directory/test.txt").createNewFile();
} catch (IOException e) {
e.printStackTrace();
}

Java

##文件编码是GBK,-Dfile.encoding="GBK"
file.encoding:GBK
java.io.IOException: 系统找不到指定的路径。
 at java.io.WinNTFileSystem.createFileExclusively(Native Method)
 at java.io.File.createNewFile(File.java:883)
 at Encoding.main(Encoding.java:72)

##鏂囦欢缂栫爜鏄疓BK,-Dfile.encoding="UTF-8"
file.encoding:UTF-8
java.io.IOException: 绯荤粺鎵句笉鍒版寚瀹氱殑璺緞銆?
 at java.io.WinNTFileSystem.createFileExclusively(Native Method)
 at java.io.File.createNewFile(File.java:883)
 at Encoding.main(Encoding.java:83)

(三)文件名字编码——System.getProperty("sun.jnu.encoding")

有关这个的说明较少,未作深入研究,请参考下面两篇文章。

Java Platform Encoding

Java 的系统属性 sun.jnu.encoding 和 file.encoding 的区别

编码总结一:Java默认字符集的更多相关文章

  1. Linux下修改默认字符集--->解决Linux下Java程序种中文文件夹file.isDirectory()判断失败的问题

    一.问题描述: 一个项目中为了生成树状目录,调用了file.listFiles()方法,然后利用file.isDirectory()方法判断是否为目录,该程序在windows下运行无问题,在Linux ...

  2. Java虚拟机(JVM)默认字符集详解

    Java中对字符串等进行转换字节数组时, 需要根据字符集编码来进行转换, 当不显示的指定字符集编码时(如: "测试".getBytes()), 会使用Charset.default ...

  3. 浅谈java使用指定字符集编码,以及常见的字符集

    问题的引入:在InputStreamReader(OutputStreamWriter)的构造方法中,有指定字符集编码,那么什么是字符集?有哪些常用的字符集?怎么用字符集进行编码? 一   什么是字符 ...

  4. Java 18为什么要指定UTF-8为默认字符集

    在Java 18中,将UTF-8指定为标准Java API的默认字符集.有了这一更改,依赖于默认字符集的API将在所有实现.操作系统.区域设置和配置中保持一致. 做这一更改的主要目标: 当Java程序 ...

  5. 修改MySQL默认字符集编码

    好记心不如烂笔头,很多东西当时没记下来,过了就忘了,下次用到时又得浪费好多时间才能解决.今天又遇到修改MySQL默认字符集编码的问题,折腾了半天解决了,赶快记录下来,以后就不用每次折腾了. 查看MyS ...

  6. java编码原理,java编码和解码问题

    java的编码方式原理 java的JVM的缺省编码方式由系统的“本地语言环境”设置确定,和操作系统的类型无关 . 在JAVA源文件-->JAVAC-->Class-->Java--& ...

  7. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  8. JAVA字符编码三:Java应用中的编码问题

    第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源:  Eceel东西在线 问题研究--字符集编码  地址:http://china.e ...

  9. 为 MySQL 设置默认字符集(UTF-8)避免产生乱码

    环境:Windows 7+Wamp Server+MySQL 5.7.9 查看MySQL默认编码: SHOW VARIABLES LIKE 'character%' character_set_cli ...

随机推荐

  1. 安装了sql-alchemy但导入sql_alchemy时失败

    问题描述:按成flask-sqlalchemy成功了,但是项目导入flask_alchemy时出错 但是,发现在代码中还是导入不了 之后发现问题,到file->setting->proje ...

  2. 强大的VS插件CodeRush发布v19.1.4|支持Visual Studio 2019

    CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验. [CodeRush for Visual Studio v19.1. ...

  3. git详细使用教程

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  4. JVM内存结构之本地方法栈

    Native Method Stacks(本地方法栈) 本地方法:指不是用Java语言编写的方法,因为Java语言是有一定限制的,有些情况下它是不能直接和操作系统打交道的.这时就需要调用一些用C或C+ ...

  5. java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作

    在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 //在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 List<String> a ...

  6. Java面试之基础篇(2)

    11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...

  7. 【JavaScript】数组方法之基础方法

    数组方法之基础方法 Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元素的数目. prototype 使您有能力向对象添加属 ...

  8. JavaScript变量和字面量

    一.什么是变量? 首先了解一下什么是内存:内存就是保存程序在运行过程中,所需要用到的数据8bit(比特是表示信息的最小单位). 8bit=1byte 1024byte=1MB 1024MB=1GB 1 ...

  9. 浙大PAT CCCC L3-014 周游世界 ( 最短路变形 )

    题目链接 题意 : 中文题请点链接,挺复杂的... 分析 : 乍一看是个最短路,实际就真的是个最短路.如果没有 “ 在有多条最短路径的时候输出换乘次数最少的” 这一条件的约束,那么这题就是直接建图然后 ...

  10. [洛谷2257]YY的GCD 题解

    整理题目转化为数学语言 题目要我们求: \[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)=p]\] 其中 \[p\in\text{质数集合}\] 这样表示显然不是很好,所以我们需 ...