web-dev-qa-db-fra.com

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

J'ai besoin d'encoder un tableau de chaînes en octets en utilisant le codage UTF-8. J'utilise Google goyave, la classe Charsets définit déjà l'instance Charset pour l'encodage UTF-8. J'ai 2 façons de faire:

  1. String.getBytes (charsetName)

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

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

Ma question est laquelle dois-je utiliser? Ils retournent le même résultat. Pour la voie 2 - je n'ai pas besoin de mettre try/catch! Je jette un œil au Java et je vois que la voie 1 et la voie 2 sont implémentées différemment.

Quelqu'un a des idées?

20
Loc

Si vous allez utiliser un littéral de chaîne (par exemple "UTF-8") ... vous ne devriez pas. Utilisez plutôt la deuxième version et fournissez la valeur constante de StandardCharsets (spécifiquement, StandardCharsets.UTF_8, Dans ce cas).

La première version est utilisée lorsque le jeu de caractères est dynamique . Ce sera le cas lorsque vous ne savez pas quel est le jeu de caractères au moment de la compilation; il est fourni par un utilisateur final, lu à partir d'un fichier de configuration ou d'une propriété système, etc.

En interne, les deux méthodes appellent une version de StringCoding.encode(). La première version de encode() recherche simplement le Charset par le nom fourni en premier, et lève une exception si ce jeu de caractères est inconnu/non disponible.

18
Brian Roach

La première API est destinée aux situations où vous ne connaissez pas le jeu de caractères au moment de la compilation; le second est pour les situations où vous le faites. Comme il semble que votre code ait spécifiquement besoin de l'UTF-8, vous devriez préférer la deuxième API:

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

La première API concerne les situations où le jeu de caractères provient de extérieur votre programme - par exemple, du fichier de configuration, de l'entrée utilisateur, dans le cadre d'une demande client au serveur, etc. C'est pourquoi une exception vérifiée est levée - pour les situations où le jeu de caractères spécifié dans la configuration ou par d'autres moyens n'est pas disponible.

10
dasblinkenlight

Puisqu'ils renvoient le même résultat, vous devez utiliser la méthode 2 car elle est généralement plus sûre et plus efficace pour éviter de demander à la bibliothèque d'analyser et éventuellement de casser une chaîne fournie par l'utilisateur. De plus, éviter le try-catch rendra votre propre code plus propre.

Le Charsets.UTF_8 peut être vérifié plus facilement au moment de la compilation, ce qui est probablement la raison pour laquelle vous n'avez pas besoin d'un try-catch.

3
merlin2011

Si vous avez déjà le Charset, utilisez la 2ème version car elle est moins sujette aux erreurs.

2
Andres