D
efault Character encoding
in Java
or charset is the character encoding used by JVM to convert bytes into String
s
or characters when you
don't define java system property "
file.encoding
". Java gets character encoding by calling
System.getProperty("file.encoding","UTF-8")
at the time of JVM start-up. So if Java doesn't get any file.en
c
o
d
ing
attribute
it uses "UTF-8" character encoding for all practical purpose e.g. on
String.getBytes()
or
Charset.defaultCharSet()
.
Most
important point
to remember is that Java caches
character encoding
or value of
system property "file.encoding" in most of its core classes like InputStreamReader which
needs
character encoding
after JVM started.
so if you change system property "file.encoding" programatically you don't
see
desired effect and that's
why
you should always work with your own character encoding provided to your application and if its need to be set than set
character encoding or charset
while you start JVM
.
In this
Java tutorial
we will see couple of different way by which we can set default character encoding or charset of Java and how to
retrieve value
of charset
inside java program.
Default Character encoding or Charset in Java
This article is in continuation of my post on Java String like Why String is immutable in Java or How SubString method works in java. If you haven’t read those you may find interesting.
What is character encoding in Java
![default character encoding or charset in java example](http://2.bp.blogspot.com/-wrzDeQGAe1I/TWu8pLuLr4I/AAAAAAAAADE/V017G-6Q61w/s1600/java_logo_50_50.jpg)
How to get Default character encoding in Java ?
There are multiple ways to get default character encoding in Java like by using system property “file.encoding” or by using java.nio.CharSet class. You can choose whatever suits your need. Let’s see them in detail.
1) "file.encoding" system property
Easiest way to get default character encoding in Java is to call
System.getProperty("file.encoding")
, which will return
default character encoding if JVM started with -Dfile.encoding property or program has not called System.setProperty("file.encoding, encoding). in later case it may just give value of that system property while various
2) java.nio.Charset
java.nio.Charset provides a convenient static method Charset.defaultCharset() which returns default character encoding in Java.
Check
example of getting default char encoding in java using Charset in code section.
3) by using Code InputStreamReader.getEncoding()
This is kind of shortcut where you use default constructor of InputStreamReader and than later gets which character encoding it
has used by calling reader.getEncoding() . See the code example of how to get default character encoding using
InputStreamReader.getEncoding()
method in code section.
How to set Default character encoding in Java ?
Just like different ways of getting default character encoding or charset in Java there are many ways to set default charset in Java. Here are some of the way:
1. Using System property "file.encoding"
by providing file.encoding system property when JVM starts e.g. java -Dfile.encoding="UTF-8" HelloWorld.
2. Using Environment variable "JAVA_TOOLS_OPTIONS"
If by anyway you don't have control how JVM starts up may be JVM is starting through some scripts which doesn't provide any
way to accept system properties. you can set environment variable JAVA_TOOL_OPTIONS to -Dfile.encoding="UTF-16" or any other
character encoding and it will picked up any JVM starts in your windows machine. JVM will also print "
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF16
" on console to indicate that it has picked JAVA_TOOS_OPTIONS. here is example of setting default character
encoding using JAVA_TOOLS_OPTIONS
test@system:~/java java HelloWorld
þÿExecuting HelloWorld
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF16
Code Example to Get and Set Default Character Encoding Java
Here is code e
xample of getting and setting default character encoding in Java:
import
java.io.ByteArrayInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.UnsupportedEncodingException;
import
java.nio.charset.Charset;
public
class
CharacterEncodingExample {
public
static
void
main(String args[])
throws
FileNotFoundException, UnsupportedEncodingException, IOException {
String defaultCharacterEncoding = System.getProperty(
"file.encoding"
);
System.
out
.println(
"defaultCharacterEncoding by property: "
+ defaultCharacterEncoding);
System.
out
.println(
"defaultCharacterEncoding by code: "
+ getDefaultCharEncoding());
System.
out
.println(
"defaultCharacterEncoding by charSet: "
+ Charset.defaultCharset());
System.setProperty(
"file.encoding"
,
"UTF-16"
);
System.
out
.println(
"defaultCharacterEncoding by property after updating file.encoding : "
+ System.getProperty(
"file.encoding"
));
System.
out
.println(
"defaultCharacterEncoding by code after updating file.encoding : "
+ getDefaultCharEncoding());
System.
out
.println(
"defaultCharacterEncoding by java.nio.Charset after updating file.encoding : "
+ Charset.defaultCharset());
}
public
static
String getDefaultCharEncoding(){
byte
[] bArray = {
'w'
};
InputStream is =
new
ByteArrayInputStream(bArray);
InputStreamReader reader =
new
InputStreamReader(is);
String defaultCharacterEncoding = reader.getEncoding();
return
defaultCharacterEncoding;
}
}
Output:
defaultCharacterEncoding by property: UTF-8
defaultCharacterEncoding by code: UTF8
defaultCharacterEncoding by charSet: UTF-8
defaultCharacterEncoding by property after updating file.encoding : UTF-16
defaultCharacterEncoding by code after updating file.encoding : UTF8
defaultCharacterEncoding by java.nio.Charset after updating file.encoding : UTF-8
Important points to note:
1) JVM caches value of default character encoding once JVM starts and so is the case for default constructors of InputStreamReader and other core Java classes. So calling
System.setProperty("file.encoding" , "UTF-16")
may not have desire effect.
2) Always work with your own character encoding if you can
,
that is more accurate and precise way of converting bytes to Strings.
That’s all on how to get default character encoding in Java and how to set it. This becomes more important when you are
writing international application which supports multiple languages. I indeed come across character encoding issues while
writing reports in kanji (Japanese) language which I plan to share in another post, but good knowledge of Character
encoding like UTF-8, UTF-16 or ISO-8859-5 and how Java supports Character Encoding in
String will certainly help.