关于java:String s = new String(s.getBytes(” UTF-8″),” UTF-8″)之间的区别是什么?和String s = new String(s.getBytes(),” UTF-8″);

What is difference between String s = new String(s.getBytes(“UTF-8”),“UTF-8”); and String s = new String(s.getBytes(),“UTF-8”);

有什么区别

1
String(s.getBytes("UTF-8"),"UTF-8");

1
String(s.getBytes(),"UTF-8");

在第一个代码示例中,一些特殊字符被解码,为什么以及有什么区别?

如果我将UTF-8一起使用双解码,会产生什么影响?


来自javadoc:

对于getBytes()

Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.

getBytes(Charset)表示:

Encodes this String into a sequence of bytes using the given charset, storing the result into a new byte array.

因此第二个版本允许您完全控制,第一个调用依赖于该平台的默认字符集。

这就是全部。

有关该"平台默认值",请参见此处的示例。请注意,人们要求将默认值设置为全部都是UTF-8(请参见此处)。


因此,您要询问以下两行:

1
2
String s1 = new String(s.getBytes("UTF-8"),"UTF-8"); // line 1
String s2 = new String(s.getBytes(),"UTF-8"); // line 2

这两条线都没有做任何有用的事情。第2行甚至比第1行还差;根据系统的默认字符编码,它可能不仅没有用,而且是错误的。

第1行实际上什么也没做。它使用UTF-8字符编码将字符串s编码为字节,然后立即使用UTF-8将字节解码回字符串。字符串s1将始终与原始字符串完全相同;编码和解码是无用的。

第2行的功能取决于系统上使用的默认字符编码。如果默认字符编码为UTF-8,则它与第1行完全相同。如果它与UTF-8不同,则将得到错误解码的字符串。

假设系统的默认字符编码为ISO-8859-1。然后,第2行使用ISO-8859-1对字符串进行编码,然后立即对结果进行解码,就好像它是UTF-8一样-这是错误的。您可能会得到一个字符串,其中包含错误解码的字符,甚至是异常。

阅读您正在使用的方法的API文档,以了解它们的作用:

  • String.getBytes(String charsetName)
  • String.getBytes()
  • String(byte[] bytes, String charsetName)(构造函数)

问题中包含的两个例子都是胡扯。

Java String作为UTF-16代码点的数组存储在内存中。
现在将byte[]标识为UTF-8代码点数组为时已晚
表示数组已被转换为字符串,

如果您收到一个byte []并想将其存储为字符串,
那么这样做很有意义:

1
2
//assume input byte[] kapow
String blammy = new String(kapow, StandardCharsets.UTF_8);

如果您有一个String值,并且想将其作为字节写到某处[]
使用UTF-8编码,
那么这很有意义

1
2
// assume input String blammy
byte[] kapow = blammy.getBytes(StandardCharsets.UTF_8);

请注意,在两种情况下,我都使用了该方法的(blah,Charset)版本。
做这个。
(blah," UTF-8 ")版本引发一个已检查的异常。
(空白,Charset)版本永远不会抛出异常,而StandardCharsets类会这样做(从StandardCharsets JavaDoc页面):

Constant definitions for the standard Charsets. These charsets are guaranteed to be available on every implementation of the Java platform.