How to convert Strings to and from UTF8 byte arrays in Java

前端 未结 13 2162
终归单人心
终归单人心 2020-11-22 13:05

In Java, I have a String and I want to encode it as a byte array (in UTF8, or some other encoding). Alternately, I have a byte array (in some known encoding) and I want to c

相关标签:
13条回答
  • 2020-11-22 13:36

    You can convert directly via the String(byte[], String) constructor and getBytes(String) method. Java exposes available character sets via the Charset class. The JDK documentation lists supported encodings.

    90% of the time, such conversions are performed on streams, so you'd use the Reader/Writer classes. You would not incrementally decode using the String methods on arbitrary byte streams - you would leave yourself open to bugs involving multibyte characters.

    0 讨论(0)
  • 2020-11-22 13:37
    Reader reader = new BufferedReader(
        new InputStreamReader(
            new ByteArrayInputStream(
                string.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));
    
    0 讨论(0)
  • 2020-11-22 13:38

    Here's a solution that avoids performing the Charset lookup for every conversion:

    import java.nio.charset.Charset;
    
    private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
    
    String decodeUTF8(byte[] bytes) {
        return new String(bytes, UTF8_CHARSET);
    }
    
    byte[] encodeUTF8(String string) {
        return string.getBytes(UTF8_CHARSET);
    }
    
    0 讨论(0)
  • 2020-11-22 13:39

    My tomcat7 implementation is accepting strings as ISO-8859-1; despite the content-type of the HTTP request. The following solution worked for me when trying to correctly interpret characters like 'é' .

    byte[] b1 = szP1.getBytes("ISO-8859-1");
    System.out.println(b1.toString());
    
    String szUT8 = new String(b1, "UTF-8");
    System.out.println(szUT8);
    

    When trying to interpret the string as US-ASCII, the byte info wasn't correctly interpreted.

    b1 = szP1.getBytes("US-ASCII");
    System.out.println(b1.toString());
    
    0 讨论(0)
  • 2020-11-22 13:39

    If you are using 7-bit ASCII or ISO-8859-1 (an amazingly common format) then you don't have to create a new java.lang.String at all. It's much much more performant to simply cast the byte into char:

    Full working example:

    for (byte b : new byte[] { 43, 45, (byte) 215, (byte) 247 }) {
        char c = (char) b;
        System.out.print(c);
    }
    

    If you are not using extended-characters like Ä, Æ, Å, Ç, Ï, Ê and can be sure that the only transmitted values are of the first 128 Unicode characters, then this code will also work for UTF-8 and extended ASCII (like cp-1252).

    0 讨论(0)
  • 2020-11-22 13:41

    I can't comment but don't want to start a new thread. But this isn't working. A simple round trip:

    byte[] b = new byte[]{ 0, 0, 0, -127 };  // 0x00000081
    String s = new String(b,StandardCharsets.UTF_8); // UTF8 = 0x0000, 0x0000,  0x0000, 0xfffd
    b = s.getBytes(StandardCharsets.UTF_8); // [0, 0, 0, -17, -65, -67] 0x000000efbfbd != 0x00000081
    

    I'd need b[] the same array before and after encoding which it isn't (this referrers to the first answer).

    0 讨论(0)
提交回复
热议问题