Converting byte array to String (Java)

JavaGoogle App-EngineCharacter EncodingBytearray

Java Problem Overview


I'm writing a web application in Google app Engine. It allows people to basically edit html code that gets stored as an .html file in the blobstore.

I'm using fetchData to return a byte[] of all the characters in the file. I'm trying to print to an html

Java Solutions


Solution 1 - Java

The byte array contains characters in a special encoding (that you should know). The way to convert it to a String is:

String decoded = new String(bytes, "UTF-8");  // example for one encoding type

By The Way - the raw bytes appear may appear as negative decimals just because the java datatype byte is signed, it covers the range from -128 to 127.


-109 = 0x93: Control Code "Set Transmit State"

The value (-109) is a non-printable control character in UNICODE. So UTF-8 is not the correct encoding for that character stream.

0x93 in "Windows-1252" is the "smart quote" that you're looking for, so the Java name of that encoding is "Cp1252". The next line provides a test code:

System.out.println(new String(new byte[]{-109}, "Cp1252")); 

Solution 2 - Java

Java 7 and above

You can also pass your desired encoding to the String constructor as a Charset constant from StandardCharsets. This may be safer than passing the encoding as a String, as suggested in the other answers.

For example, for UTF-8 encoding

String bytesAsString = new String(bytes, StandardCharsets.UTF_8);

Solution 3 - Java

You can try this.

String s = new String(bytearray);

Solution 4 - Java

public class Main {
    
    /**
     * Example method for converting a byte to a String.
     */
    public void convertByteToString() {
        
        byte b = 65;
        
        //Using the static toString method of the Byte class
        System.out.println(Byte.toString(b));

        //Using simple concatenation with an empty String
        System.out.println(b + "");
        
        //Creating a byte array and passing it to the String constructor
        System.out.println(new String(new byte[] {b}));
        
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().convertByteToString();
    }
}

Output

65
65
A

Solution 5 - Java

public static String readFile(String fn)   throws IOException 
{
	File f = new File(fn);
	
	byte[] buffer = new byte[(int)f.length()];
	FileInputStream is = new FileInputStream(fn);
	is.read(buffer);
	is.close();
	
	return  new String(buffer, "UTF-8"); // use desired encoding
}

Solution 6 - Java

I suggest Arrays.toString(byte_array);

It depends on your purpose. For example, I wanted to save a byte array exactly like the format you can see at time of debug that is something like this : [1, 2, 3] If you want to save exactly same value without converting the bytes to character format, Arrays.toString (byte_array) does this,. But if you want to save characters instead of bytes, you should use String s = new String(byte_array). In this case, s is equal to equivalent of [1, 2, 3] in format of character.

Solution 7 - Java

The previous answer from Andreas_D is good. I'm just going to add that wherever you are displaying the output there will be a font and a character encoding and it may not support some characters.

To work out whether it is Java or your display that is a problem, do this:

    for(int i=0;i<str.length();i++) {
        char ch = str.charAt(i);
        System.out.println(i+" : "+ch+" "+Integer.toHexString(ch)+((ch=='\ufffd') ? " Unknown character" : ""));
    }

Java will have mapped any characters it cannot understand to 0xfffd the official character for unknown characters. If you see a '?' in the output, but it is not mapped to 0xfffd, it is your display font or encoding that is the problem, not Java.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoshView Question on Stackoverflow
Solution 1 - JavaAndreas DolkView Answer on Stackoverflow
Solution 2 - JavadavnicwilView Answer on Stackoverflow
Solution 3 - JavaMuhammad Aamir AliView Answer on Stackoverflow
Solution 4 - JavaAdi SembiringView Answer on Stackoverflow
Solution 5 - JavacraigView Answer on Stackoverflow
Solution 6 - JavaQuestionerView Answer on Stackoverflow
Solution 7 - JavaSimon G.View Answer on Stackoverflow