Question

Existe-t-il une bibliothèque java gratuite que je peux utiliser pour convertir une chaîne d'un codage en un autre, comme iconv ? J'utilise Java version 1.3.

Était-ce utile?

La solution

Vous n'avez pas besoin d'une bibliothèque autre que celle standard - utilisez simplement Jeu de caractères . (Vous pouvez simplement utiliser les constructeurs String et les méthodes getBytes, mais personnellement, je n'aime pas travailler uniquement 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 de Charset, tout en conservant la facilité d'utilisation des méthodes String: nouvelle chaîne (octets, jeu de caractères) et Chaîne. getBytes (charset) .

Voir " Encodage d'URL (ou: 'Quels sont ces " << code>% 20 "Codes dans les URL? ') ".

Autres conseils

CharsetDecoder devrait être ce que vous cherchez, non?

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

Voir Jeu de caractères . Cela ne signifie pas que 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 Unités de code Unicode et des séquences d'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 aussi appelé ISO-LATIN-1 , UTF-8 , < code> 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 en octets codés dans un ByteBuffer en chaîne dans un CharBuffer et inversement.

// 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) {
}

Je voudrais juste ajouter que si la chaîne est codée à l'origine à l'aide d'un codage incorrect, il pourrait être impossible de la remplacer par un autre codage sans erreur. La question ne dit pas que la conversion ici est faite d'un mauvais encodage pour corriger l'encodage, mais je suis personnellement tombé sur cette question juste à cause de cette situation, alors n'hésitez pas à avertir les autres également.

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

C’est beaucoup plus facile si vous considérez l’unicode comme un jeu de caractères (ce qu’il est en réalité - c’est très fondamentalement le jeu numéroté de tous les caractères connus). Vous pouvez le coder au format UTF-8 (1 à 3 octets par caractère) ou peut-être au format UTF-16 (2 octets par caractère ou 4 octets à l'aide de paires de substitution).

De retour dans le brouillard du temps, Java utilisait UCS-2 pour coder le jeu de caractères unicode. Cela ne pouvait gérer que 2 octets par caractère et est maintenant obsolète. Il était assez évident d'ajouter des paires de substitution et de passer à l'UTF-16.

Beaucoup de gens pensent qu’ils auraient d’abord dû utiliser le format UTF-8. Quand Java a été écrit à l'origine, Unicode comptait quand même bien plus de 65 535 caractères ...

UTF-8 et UCS-2 / UTF-16 peuvent être distingués assez facilement au moyen d’un repère d’octet au début du fichier. Si cela existe, il y a fort à parier que le fichier se trouve 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 qu’il n’a pas de marque d’octet.

Je ne connais pas grand chose à propos de ISO-8859-2, mais je ne serais pas surpris si presque tous les fichiers sont des fichiers texte valides dans cet encodage. Le mieux que vous puissiez faire est de le vérifier de manière heuristique. En effet, la page Wikipedia qui en parle suggérerait que seul l'octet 0x7f est invalide.

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

Source par stackoverflow

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top