Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串编码(UTF-8)_Java_String_Encoding - Fatal编程技术网

Java字符串编码(UTF-8)

Java字符串编码(UTF-8),java,string,encoding,Java,String,Encoding,我遇到了这一行遗留代码,我正试图弄清楚: String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 据我所知,这是使用相同的字符集进行编码和解码 这与下面有什么不同 String newString = oldString; 是否存在两行输出不同的场景? p、 s:我只是想澄清一下,是的,我知道 这与下面有什么不同 String newString = oldString; 这行代码如下: String ne

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

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
据我所知,这是使用相同的字符集进行编码和解码

这与下面有什么不同

String newString = oldString;
是否存在两行输出不同的场景?

p、 s:我只是想澄清一下,是的,我知道

这与下面有什么不同

String newString = oldString;
这行代码如下:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
构造一个新字符串对象(即
oldString
的副本),而此行代码:

String newString = oldString;
声明类型为
java.lang.String
的新变量,并将其初始化为引用与变量
oldString
相同的字符串对象

是否存在两条生产线输出不同的情况

绝对:

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

一匹没有名字的马当然是对的。相当于

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


减去彼得·劳里在回答中解释的细微差别,编码就变了。

这可能是一种复杂的方法

String newString = new String(oldString);
这缩短了字符串的长度,因为使用的底层char[]要长得多

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

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

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

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

false

当然,一个区别是
String newString=oldString,您仍然只有字符串的一个副本(您只是从两个变量指向它)。解码/编码生成字符串的副本。这并不重要,因为
String
s是不可变的。不过,这可能不是旧代码是这样的原因
String
有一种更直接的方法来克隆自身(
String(String)
)。除了测试
String
类的编码/解码方法之外,我想不出一个好的理由来进行编码/解码。上下文是否给出了任何提示,说明为什么字符串转换可能已经或曾经是必要的?@t.J.Crowder:+1,当然!我并不是指所指的实际对象的差异。感谢您指出这一点。还有一个主要区别:其中一个没有编译;-)
String newString=newString(oldString)
将等同于“原始”行,我猜,
oldString
无法正确编码的唯一原因是它不是一个有效的UTF-16(Java字符串的本机表示形式)字符串。UTF-8本身完全能够编码任何和所有Unicode代码点。在这种情况下,只有当
oldString
包含无效的UTF-16字节序列时,才会有区别。
false