web-dev-qa-db-fra.com

Conversion d'encodage en java

Existe-t-il une bibliothèque Java Java gratuite que je peux utiliser pour convertir une chaîne dans un encodage en un autre encodage, quelque chose comme iconv ? J'utilise = Java version 1.3.

30
tropikalista

Vous n'avez pas besoin d'une bibliothèque au-delà de la bibliothèque standard - utilisez simplement Charset . (Vous pouvez simplement utiliser les constructeurs String et les méthodes getBytes, mais personnellement, je n'aime pas simplement travailler avec les noms des encodages de caractères. Trop de place pour les fautes de frappe.)

EDIT: Comme indiqué dans les commentaires, vous pouvez toujours utiliser des instances Charset mais avoir la facilité d'utilisation des méthodes String: new String (bytes, charset) and String.getBytes (charset) .

Voir " Encodage URL (ou: 'Que sont ces"? %20 "codes dans les URL? ') ".

41
Jon Skeet

CharsetDecoder devrait être ce que vous cherchez, non?

De nombreux protocoles et fichiers réseau stockent leurs caractères avec un jeu de caractères orienté octet tel que ISO-8859-1 (ISO-Latin-1).
Cependant, l'encodage des caractères natifs de Java est Unicode UTF16BE (Format de transformation UCS à seize bits, ordre des octets big-endian).

Voir Charset . Cela ne signifie pas UTF16 est le jeu de caractères par défaut (c'est-à-dire: le "mappage par défaut" entre des séquences de seize bits nités de code Unicode et des séquences de octets "):

Chaque instance de la machine virtuelle Java a un jeu de caractères par défaut, qui peut ou non être l'un des jeux de caractères standard.
[US-ASCII, ISO-8859-1 alias. ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
Le jeu de caractères par défaut est déterminé lors du démarrage de la machine virtuelle et dépend généralement des paramètres régionaux et du jeu de caractères utilisés par le système d'exploitation sous-jacent.

Cet exemple montre comment convertir ISO-8859-1 octets codés dans un ByteBuffer vers une chaîne dans un CharBuffer et vice versa.

// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}
19
VonC

Je voudrais juste ajouter que si la chaîne est à l'origine encodée en utilisant le mauvais encodage, il pourrait être impossible de la changer en un autre encodage sans erreurs. La question ne dit pas que la conversion ici est faite à partir d'un mauvais codage pour un codage correct, mais j'ai personnellement trébuché sur cette question juste à cause de cette situation, donc juste pour les autres.

Cette réponse dans une autre question explique pourquoi la conversion ne donne pas toujours des résultats corrects https://stackoverflow.com/a/2623793/4702806

2
wallabui

C'est beaucoup plus facile si vous pensez à l'unicode comme un jeu de caractères (ce qu'il est en fait - c'est très fondamentalement le jeu numéroté de tous les caractères connus). Vous pouvez l'encoder en UTF-8 (1 à 3 octets par caractère selon) ou peut-être en UTF-16 (2 octets par caractère ou 4 octets en utilisant des paires de substitution).

Retour dans la brume du temps Java utilisé pour utiliser UCS-2 pour coder le jeu de caractères unicode. Cela ne pouvait gérer que 2 octets par caractère et est désormais obsolète. C'était un hack assez évident à ajouter remplacer les paires et passer à UTF-16.

Beaucoup de gens pensent qu'ils auraient dû utiliser UTF-8 en premier lieu. Quand Java a été écrit à l'origine unicode avait de toute façon plus de 65535 caractères ...

0
Anon

UTF-8 et UCS-2/UTF-16 peuvent être distingués assez facilement via une marque d'ordre d'octets au début du fichier. Si cela existe, il y a fort à parier que le fichier est dans cet encodage - mais ce n'est pas une certitude absolue. Vous pouvez également constater que le fichier se trouve dans l'un de ces encodages, mais n'a pas de marque d'ordre d'octets.

Je ne sais pas grand-chose sur ISO-8859-2, mais je ne serais pas surpris si presque chaque fichier est un fichier texte valide dans cet encodage. Le mieux que vous puissiez faire est de le vérifier heuristiquement. En effet, la page Wikipédia qui en parle suggère que seul l'octet 0x7f n'est pas valide.

Il n'y a aucune idée de lire un fichier "tel quel" et pourtant d'extraire du texte - un fichier est une séquence d'octets, vous devez donc appliquer un codage de caractères afin de décoder ces octets en caractères.

Source par stackoverflow

0
brijesh k