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

2022-09-01 22:41:14

我需要使用 UTF-8 编码对字符串到字节数组进行编码。我正在使用谷歌番石榴,它有Charsets类已经定义了用于UTF-8编码的Charset实例。我有2种方法:

  1. String.getBytes( charsetName )

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

    // Charsets.UTF_8 is an instance of Charset    
    
    byte[] bytes = my_input.getBytes ( Charsets.UTF_8 );
    

我的问题是我应该使用哪一个?它们返回相同的结果。对于方式2 - 我不必把尝试/捕捉!我看了一下Java源代码,我看到方式1和方式2的实现方式不同。

有人有什么想法吗?


答案 1

如果您要使用字符串文本(例如“UTF-8”)...你不应该。请改用第二个版本,并从 StandardCharsets 中提供常量值(在本例中为 具体而言为 )。StandardCharsets.UTF_8

当字符集是动态的时,将使用第一个版本。当您在编译时不知道字符集是什么时,情况就是如此;它由最终用户提供,从配置文件或系统属性中读取,等等。

在内部,这两种方法都调用 的一个版本。的第一个版本是简单地首先查找按提供的名称,如果该字符集未知/不可用,则引发异常。StringCoding.encode()encode()Charset


答案 2

第一个API适用于您在编译时不知道字符集的情况;第二个是针对你这样做的情况。由于您的代码似乎特别需要 UTF-8,因此您应该更喜欢第二个 API:

byte[] bytes = my_input.getBytes ( Charsets.UTF_8 ); // <<== UTF-8 is known at compile time

第一个 API 适用于字符集来自程序外部的情况 - 例如,来自配置文件、用户输入、作为客户端对服务器的一部分请求等。这就是为什么有一个已检查的异常从中引发的原因 - 对于配置中指定的字符集或通过某些其他方式指定的字符集不可用的情况。