在Java中将字节转换为字符串

bri*_*ian 20 java

我使用下面的代码将字节转换为字符串:

System.out.println("string " + Byte.toString((byte)0x63));
Run Code Online (Sandbox Code Playgroud)

为什么打印"字符串99".如何修改让它打印"字符串c"?

Mic*_*rdt 35

System.out.println(new String(new byte[]{ (byte)0x63 }, "US-ASCII"));
Run Code Online (Sandbox Code Playgroud)

请特别注意,将字节转换为字符串始终涉及编码.如果您没有指定它,您将使用平台默认编码,这意味着代码在不同环境中运行时可能会中断.

  • 为了避免由该构造函数抛出的已检查的`UnsupportedEncodingException`,您可能希望传入[`StandardCharsets.US_ASCII`](http://docs.oracle.com/javase/7/docs/api/java/nio/charset /StandardCharsets.html#US_ASCII)而不是使用charset名称. (13认同)

Mat*_*ten 20

字符串ctor适合此转换:

System.out.println("string " + new String(new byte[] {0x63}));
Run Code Online (Sandbox Code Playgroud)

  • 因为gustafc的答案很重要:String(byte [])构造函数使用系统默认编码将字节数组转换为String字符。不应假定0x63字节的值已映射到字母'c'。例如,在UTF-16中,字母“ c”由2个编码字节表示,而不是1个。该博客文章对此进行了详细说明:http://www.joelonsoftware.com/articles/Unicode.html (2认同)

gus*_*afc 12

使用char而不是byte:

System.out.println("string " + (char)0x63);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想成为Unicode清教徒,则使用代码点:

System.out.println("string " + new String(new int[]{ 0x63 }, 0, 1));
Run Code Online (Sandbox Code Playgroud)

如果你喜欢旧的skool US-ASCII"每个字节都是一个字符"的想法:

System.out.println("string " + new String(new byte[]{ (byte)0x63 },
                                          StandardCharsets.US_ASCII));
Run Code Online (Sandbox Code Playgroud)

避免使用String(byte[])其他答案中推荐的构造函数; 它依赖于默认的字符集.0x63实际上不是角色c的情况可能会出现.


MBy*_*ByD 6

您可以使用printf

System.out.printf("string %c\n", 0x63);
Run Code Online (Sandbox Code Playgroud)

您也可以使用String#format以下格式创建一个字符串:

String s = String.format("string %c", 0x63);
Run Code Online (Sandbox Code Playgroud)