Java String.getBytes(charsetName)vs String.getBytes(Charset object)

时间:2014-04-26 21:32:39

标签: java string character-encoding

我需要使用UTF-8编码将String编码为字节数组。我正在使用Google guava,它有Charsets类已经为UTF-8编码定义了Charset实例。我有两种方法可以做:

  1. String.getBytes(charsetName)

    try {        
        byte[] bytes = my_input.getBytes ( "UTF-8" );
    } catch ( UnsupportedEncodingException ex) {
    
    }
    
  2. String.getBytes(Charset对象)

    // Charsets.UTF_8 is an instance of Charset    
    
    byte[] bytes = my_input.getBytes ( Charsets.UTF_8 );
    
  3. 我的问题是我应该使用哪一个?他们返回相同的结果。对于方式2 - 我不必放置try / catch!我看一下Java源代码,我看到方式1和方式2的实现方式不同。

    任何人都有任何想法?

4 个答案:

答案 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,那么请使用第二版,因为它不易出错。