【问题标题】:Java String encoding (UTF-8)Java 字符串编码 (UTF-8)
【发布时间】:2012-01-13 16:45:58
【问题描述】:

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

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

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

这与以下有何不同?

String newString = oldString;

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

p.s.:澄清一下,是的,我知道excellent article on encoding by Joel Spolsky

【问题讨论】:

  • 当然,一个的区别在于String newString = oldString;,你仍然只有一个字符串的副本(你只是从两个变量指向它)。解码/编码生成字符串的副本。这并不重要,因为Strings 是不可变的。不过,这可能不是旧代码如此的原因; String 有一种更直接的克隆方式 (String(String))。除了测试String 类的编码/解码方法之外,我想不出你为什么要进行编码/解码的 理由。
  • 上下文是否暗示了为什么字符串转换可能已经或曾经是必要的?
  • @T.J.Crowder:+1,当然!我并不是指所指的实际对象的差异。感谢您指出这一点。
  • 还有一个主要区别:其中一个不能编译 ;-)

标签: java string encoding


【解决方案1】:

这可能是一种复杂的方式

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

【讨论】:

  • oldString 无法正确编码的唯一原因是因为它不是一个有效的 UTF-16(Java 中字符串的本机表示)字符串开头。 UTF-8 完全能够对任何和所有 Unicode 代码点本身进行编码。在这种情况下,只有当oldString 包含无效的 UTF-16 字节序列时才会有所不同。
【解决方案2】:

这与以下有何不同?

这里的这行代码:

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

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

String newString = oldString;

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

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

绝对:

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 在他的回答中解释的编码的细微差别。

【讨论】:

  • String newString = new String(oldString) 相当于我猜的“原始”行
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多