在Java中,我有一个String,我想将其编码为字节数组(UTF8或其他编码).或者,我有一个字节数组(在一些已知的编码中),我想将其转换为Java字符串.我该如何进行这些转换?
从String转换为byte []:
String s = "some text here"; byte[] b = s.getBytes(StandardCharsets.UTF_8);
从byte []转换为String:
byte[] b = {(byte) 99, (byte)97, (byte)116}; String s = new String(b, StandardCharsets.US_ASCII);
当然,您应该使用正确的编码名称.我的例子使用了US-ASCII和UTF-8这两种最常见的编码.
这是一个避免为每次转换执行Charset查找的解决方案:
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); }
String original = "hello world"; byte[] utf8Bytes = original.getBytes("UTF-8");
您可以直接通过String(byte [],String)构造函数和getBytes(String)方法进行转换.Java通过Charset类公开可用的字符集.JDK文档列出了支持的编码.
90%的情况下,此类转换是在流上执行的,因此您将使用Reader/Writer类.您不会在任意字节流上使用String方法进行增量解码 - 您可能会对涉及多字节字符的错误开放.
我的tomcat7实现接受字符串为ISO-8859-1; 尽管HTTP请求的内容类型.在尝试正确解释像'é'这样的字符时,以下解决方案对我有用.
byte[] b1 = szP1.getBytes("ISO-8859-1"); System.out.println(b1.toString()); String szUT8 = new String(b1, "UTF-8"); System.out.println(szUT8);
尝试将字符串解释为US-ASCII时,未正确解释字节信息.
b1 = szP1.getBytes("US-ASCII"); System.out.println(b1.toString());
作为替代方案,可以使用Apache Commons的StringUtils.
byte[] bytes = {(byte) 1}; String convertedString = StringUtils.newStringUtf8(bytes);
要么
String myString = "example"; byte[] convertedBytes = StringUtils.getBytesUtf8(myString);
如果您有非标准字符集,则可以相应地使用getBytesUnchecked()或newString().