我需要使用UTF-8编码将String编码为字节数组。我正在使用Google guava,它有Charsets类已经为UTF-8编码定义了Charset实例。我有两种方法可以做:
String.getBytes(charsetName)
try {
byte[] bytes = my_input.getBytes ( "UTF-8" );
} catch ( UnsupportedEncodingException ex) {
}
String.getBytes(Charset对象)
// Charsets.UTF_8 is an instance of Charset
byte[] bytes = my_input.getBytes ( Charsets.UTF_8 );
我的问题是我应该使用哪一个?他们返回相同的结果。对于方式2 - 我不必放置try / catch!我看一下Java源代码,我看到方式1和方式2的实现方式不同。
任何人都有任何想法?
答案 0 :(得分:17)
如果您打算使用字符串文字(例如" UTF-8")......您不应该这样做。而是使用第二个版本并提供StandardCharsets
的常量值(在本例中为StandardCharsets.UTF_8
)。
当字符集动态时使用第一个版本。当您在编译时不知道字符集是什么时,就会出现这种情况;它由最终用户提供,从配置文件或系统属性中读取等。
在内部,两种方法都在调用StringCoding.encode()
的版本。 encode()
的第一个版本只是首先按提供的名称查找Charset
,如果该字符集未知/不可用则抛出异常。
答案 1 :(得分:9)
第一个API适用于在编译时不知道字符集的情况;第二个是你做的情况。由于您的代码似乎需要特定的UTF-8,因此您应该更喜欢第二个API:
byte[] bytes = my_input.getBytes ( Charsets.UTF_8 ); // <<== UTF-8 is known at compile time
第一个API用于charset来自 outside 程序的情况 - 例如,来自配置文件,来自用户输入,作为客户端请求到服务器的一部分,等等。这就是为什么抛出一个检查过的异常的原因 - 在配置中指定的字符集或通过其他方法不可用的情况。
答案 2 :(得分:3)
由于它们返回相同的结果,因此您应该使用方法2,因为它通常更安全,更有效,以避免要求库解析并可能中断用户提供的字符串。此外,避免try-catch也会使你自己的代码更清晰。
在编译时可以更轻松地检查Charsets.UTF_8
,这很可能是您不需要try-catch
的原因。
答案 3 :(得分:2)
如果您已经拥有Charset,那么请使用第二版,因为它不易出错。