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:
String.getBytes (charsetName)
try {
byte[] bytes = my_input.getBytes ( "UTF-8" );
} catch ( UnsupportedEncodingException ex) {
}
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?
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.
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.
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
.
Si vous avez déjà le Charset, utilisez la 2ème version car elle est moins sujette aux erreurs.