Java 字符串编码 (UTF-8)

2022-09-02 21:13:46

我遇到了这行遗留代码,我试图弄清楚:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));

据我所知,它是使用相同的charSet进行编码和解码的。

这与以下内容有何不同?

String newString = oldString;

是否存在两条线路具有不同输出的情况?

p.s.:只是为了澄清,是的,我知道Joel Spolsky关于编码的优秀文章


答案 1

这可能是一种复杂的做事方式

String newString = new String(oldString);

这缩短了字符串是底层字符[]使用的要长得多。

但是,更具体地说,它将检查每个字符是否可以进行UTF-8编码。

字符串中有一些“字符”无法编码,这些字符将转换为?

\uD800 和 \uDFFF 之间的任何字符都无法编码,并且将转换为“?”

String oldString = "\uD800";
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8");
System.out.println(newString.equals(oldString));

指纹

false

答案 2

这与以下内容有何不同?

这行代码在这里:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));

构造一个新的 String 对象(即 的副本),而这行代码:oldString

String newString = oldString;

声明一个类型的新变量,并将其初始化为引用与变量 相同的 String 对象。java.lang.StringoldString

是否存在两条线路具有不同输出的情况?

绝对:

String newString = oldString;
boolean isSameInstance = newString == oldString; // isSameInstance == true

与。

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
 // isSameInstance == false (in most cases)    
boolean isSameInstance = newString == oldString;

a_horse_with_no_name(见评论)当然是正确的。等效于

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));

String newString = new String(oldString);

减去彼得·劳里(Peter Lawrey)在回答中解释的编码的细微差别。