在Java中,我有一个字符串,我想将它编码为字节数组(在UTF8中,或其他编码中)。或者,我有一个字节数组(在一些已知的编码中),我想将它转换为Java String。我怎么做这些转换?
当前回答
String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
其他回答
如果你使用的是7位ASCII或ISO-8859-1(一种非常常见的格式),那么你根本不需要创建一个新的java.lang.String。简单地将字节转换为char类型的性能要好得多:
完整的工作示例:
for (byte b : new byte[] { 43, 45, (byte) 215, (byte) 247 }) {
char c = (char) b;
System.out.print(c);
}
如果你不使用扩展字符,如Ä, Æ, Å, Ç, Ï, Ê,并且可以确定唯一传输的值是前128个Unicode字符,那么这段代码也适用于UTF-8和扩展ASCII(如cp-1252)。
我的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());
将字符串转换为字节[]:
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
将字节[]转换为字符串:
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");
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- Printf与std::字符串?
- 在Jar文件中运行类
- 带参数的可运行?
- 不区分大小写的“in”
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- 如何在PHP中截断字符串最接近于一定数量的字符?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作