Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Wiki Markup
Every Java platform has a default character encoding.  The codingsavailable availableencodings are listed in \[[Encodings 06|AA. Java References#Encodings 06]\]. The default encoding is used when a character is converted to a sequence of bytes and _vice versa_.  If characters are being converted into an array of bytes, to output, transmitted across some medium, input, and converted back into characters, then it is clearly important that the same encoding ismust be used on both sidesides of the conversionconversation.

According to the Java API [API 06] for the String class:

The length of the new String is a function of the charset, and hence may not be equal to the length of the byte array. The behavior of this constructor when the given bytes are not valid in the given charset is unspecified.

Also, see the related guideline FIO02-J. Keep track of bytes read and account for character encoding while reading data.

...

In this noncompliant code example, a byte array is read and converted into a string String using the default character encoding for the platform. If this is not the same encoding as the one that was used to produce the byte array then , the resulting string will be garbage because the String is likely to be incomprehensible because some of the bytes may not have valid character representations in the default encoding.

Code Block
bgColorFFCCCC#FFCCCC
FileInputStream fis = new FileInputStream("SomeFile");
DataInputStream dis = new DataInputStream(fis);
int bytesRead = 0;
byte[] data = new byte[1024];

bytesRead = dis.readFully(data);

if (bytesRead > 0) {
   String result = new String(data);
}

...

In this compliant solution, the encoding is explicitly specified by using the string String encoding as the second parameter of the String constructor.

Code Block
bgColorCCCCFF#CCCCFF
String encoding = "SomeEncoding" // for example, "UTF-16LE"

FileInputStream fis = new FileInputStream("SomeFile");
DataInputStream dis = new DataInputStream(fis);
int bytesRead = 0;
byte[] data = new byte[1024];

bytesRead = dis.readFully(data);

if (bytesRead > 0) {
   String result = new String(data, encoding);
}

Exceptions

*EX1:* If the data is coming from another Java application on the same platform and it is known that that the application is using the default character encoding, then an explicit character encoding does not need to be specified on the receiving side.

...