从Java 1.7开始,StandardCharsets是标准库的一部分,但我使用了许多遗留代码,这些代码在实现之前就已经很好地编写了。每当我遇到它时,我一直在用StandardCharsets替换它们(主要是为了使代码更漂亮/更干净),但我担心在具有性能关键部分或我无法轻松调试的区域中进行这些更改。
是否有任何技术原因不使用标准字符集?因为,有没有'陷阱'使用StandardCharsets而不是Guava字符集或类似getBytes(" UTF-8")可能产生的低效率?我知道"这些字符集保证可以在Java平台的每个实现中使用。",但我不知道他们是否更慢或者有些怪癖旧方法不适用#39; t。
尝试保持这个主题,假设没有影响这个的主观力量,如其他开发者的偏好,对变化的抵制等。
此外,如果它影响任何东西,UTF-8是我真正关心的编码。
答案 0 :(得分:2)
因为,有没有'陷阱'使用StandardCharsets而不是Guava字符集或类似getBytes(" UTF-8")可能产生的低效率?
首先,java.nio.charset.StandardCharsets.UTF_8
(在OpenJDK / Oracle JDK中实现),com.google.common.base.Charsets.UTF_8
和org.apache.commons.io.Charsets.UTF_8
都完全相同:
public static final Charset UTF_8 = Charset.forName("UTF-8");
所以,至少,你不必担心与Guava Charsets或Charset.forName("UTF-8")
的差异。
至于String.getBytes(String)
和String.getBytes(Charset)
,我确实看到了文档的不同之处:
String.getBytes(Charset)
:"此方法始终使用此charset的默认替换字节数组替换格式错误的输入和不可映射字符序列。"。String.getBytes(String)
:"未指定此字符串无法在给定字符集中进行编码时此方法的行为。"。因此,根据您使用的JRE,我预计someString.getBytes("UTF-8")
和someString.getBytes(StandardCharsets.UTF_8)
之间处理不可映射的字符可能会有所不同。
答案 1 :(得分:2)
您应该使用它们,只是因为您无法获得UnsupportedCharSetException,如果您使用forName方法并拼错名称就是这种情况。
将“错误的可能性”从运行时“移动”到编译时总是一个好主意。
答案 2 :(得分:0)
不使用StandardCharsets的最佳理由可能是使用特殊字符。自Java 1以来,并非所有角色都可用,因此尽管这对于遗留程序来说是最好的,但它并不是普遍可用且对每个人都有用。
然后,对大多数人来说这可能很好 - 我无法想象这里会出现任何性能问题。