IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Conversion UTF-8 -> EBCDIC et entities


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut Conversion UTF-8 -> EBCDIC et entities
    Bonjour,

    Je dois actuellement convertir des fichiers de données en EBCIDC et j'ai quelques soucis sur la conversion de certaines entity.

    Actuellement, mon programmes recoit en entrée un fichier de données dans n'importe quel type de format (ca peut etre de l'UTF-8, de l'EBCDIC, de l'ASCII). J'ai donc une première phase qui permet de standardiser le format de ces données en UTF-8, puis une seconde qui convertie au format EBCDIC ces données.

    Or il se trouve qu'en sortie, dans mes fichiers au format EBCDIC, j'ai des données corrompues (mal converties).
    Par exemple, dans l'un des fichiers d'entrée j'ai au beau millieu d'une phrase, cette entité là : &#x2215
    (symbole pour le '/') et en sortie je me retrouve avec un '.' au lieu d'avoir un '/'.

    Mon problème est donc de réussir à garder intacte les données fournies en entrée. Comment pourrais-je faire pour détecter de telles erreurs, et convertir convenablement ce type d'entité ?
    J'ai fais quelques recherches et j'ai trouvé la valeur &#47 en unicode pour le '/', et non 2215. Peut-être est ce donc normal que j'obtienne un '.' dans mon fichier converti. Mais dans ce cas là, comment interpréter de la même façon plusieurs entités ? Ou plutot comment faire pour que mon programme associe certaines entités à certaines valeur (ici remplacer &#x2215 par &x47) ?

    Merci à ceux qui me viendront en aide.
    Si je n'ai pas été assez clair faites le moi savoir

  2. #2
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Je me demandais s'il était possible d'associer une autre valeur de la même facon qu'une DTD ?

    Par exemple dans la DTD du fichier xml standardiser, j'ai la définition suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <!ENTITY CACUTE           "&#x00106;" >
    Qui remplacera donc &CACUTE par sa valeur héxadécimal.

    Est-ce possible d'associer une valeur héxa à un autre de la même facon, ex :
    J'ai essayé plusieurs syntaxe mais ca ne semble pas fonctionner, quelqun a déjà essayé ?

  3. #3
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Bonjour,

    Personne n'a d'idée ?

    Je vais tourner le problème dans un autre sens : comment faire pour convertir des caractères spéciaux ASCII en EBCDIC sans corrompre leur valeur (mauvaise valeur en EBCDIC)

    Voici ce que je fais pour le moment, j'ai d'une part une table de conversion EBCIDC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    // --- Cp500 revert table
    	public final static int[] Cp500Revert = {
    			/*00*//*02*//*03*//*04*//*05*//*06*//*07*//*08*//*09*//*10*//*11*//*12*//*13*//*14*//*15*//*16*/		
    	/*000*/	0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 
    	/*016*/	0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 
    	/*032*/	0x40, 0x4F, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, 
    	/*048*/	0xf0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, 		
    	/*064*/	0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 
    	/*080*/	0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0x4A, 0xE0, 0x5A, 0x5F, 0x6D, 
    	/*096*/	0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 
    	/*112*/	0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0xBB, 0xD0, 0xA1, 0x07, 		
    	/*128*/	0x31, 0x30, 0x35, 0x34, 0x1A, 0x33, 0x36, 0x38, 0x39, 0x08, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0x1B, 
    	/*144*/	0x22, 0x21, 0x20, 0x25, 0x23, 0x24, 0x06, 0x28, 0x29, 0x17, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0xFF, 
    	/*160*/	0x41, 0xAA, 0xB0, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, 0xBD, 0xB4, 0x9A, 0x8A, 0xBA, 0xCA, 0xAF, 0xBC, 
    	/*176*/	0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB, 		
    	/*192*/	0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9e, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, 
    	/*208*/	0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xAD, 0xAE, 0x59, 
    	/*224*/	0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x8C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, 
    	/*240*/	0x9C, 0x49, 0xCD, 0xCD, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF, 
    	};
    Et un petite fonction de conversion d'une chaine de caractère ASCII :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public byte[] convertString (String string, int length) {		
    	if (length < 0)
    		throw new IllegalArgumentException("[Ascii2EbcdicConverter.convertString]");
     
    	// --- ensure capacity
    	buffer = new byte[length];
     
    	// --
    	StringBuffer sb = new StringBuffer();
    	if (string.length() <= length){
    		if (string.length() > 0)
    			sb.append(string);
     
    		while (sb.length() < length)				
    			sb.append(CHAR_SPACE);
    	}
    	else
    		sb.append(string.substring( 0, length ));
     
    	// ---
    	String _newString = sb.toString();
    	int index = 0;
    	for (int i = 0; i < length; i++) {
    		index = _newString.charAt(i) & 0xFF;
    		buffer[i] = (byte) Cp500Revert[index];
    	}
    	// --- Return	
    	return buffer;
    }
    Cette fonction marche très bien, sauf pour les caractères qui "sortent" de la table de conversion.

    Un petit exemple, le caractère 'à', de valeur E0 en héxa en entrée (dans un fichier xml), est encodé par la fonction en caractère '£', de valeur héxa A3 en sortie. Ce qui n'est pas bon évidemment. D'autres caractères (comme le '/' mathématique) sont encodés dans une valeur non interprétable (affichés par un '.' suite à une reconversion en ASCII ou via un éditeur EBCDIC).

    Je n'ai réussi à trouver que la table "normale" EBCDIC mais aucune étendue (pour les caractères spéciaux).
    Je sais qu'en ASCII il y a une table normale et la table étendue, contenant ces fameux caractères spéciaux, mais qu'en est-il en EBCIDC ?

    Si quelqun pouvait me venir en aide ce serait très sympa de sa part car je galère dessus depuis pas mal de temps sans aboutir à quoi que ce soit .

    Merci à ceux qui me liront.

  4. #4
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Je pensais que ma table de conversion ASCII -> EBCDIC était bonne (reprise d'un autre projet), mais en regardant de plus prêt, je m'apercoit par exemple que pour le signe '&' ayant pour valeur héxa '26', correspond dans ma table la valeur héxa (à la place 26 donc) '0x3F' (63 en décimal), ce qui représente dans la table EBCDIC la valeur 'SUB' et non '&' (qui a pour valeur héxa 50 dans la table EBCDIC).

    Je vais donc reprendra cette table de conversion caractère par caractère (mon dieu ) et voir si la conversion se passe mieux, auquel cas je mettrais cette table ici que ca puisse profiter à d'autre (ne sait on jamais)

  5. #5
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Pour info, j'ai découvert un produit intéressant qui s'appelle ServingXML (http://servingxml.sourceforge.net/) qui est capable de faire différentes conversions...
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  6. #6
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Merci pour cette info alain
    Je ne pense pas utiliser pour autant cette solution (par manque de temps, il me faudrait approffondir mes connaissances dans cet outil), donc je cherche toujours une solution qui permet d'encoder proprement et correctement une chaine ASCII (avec caractères spéciaux) en EBCDIC.

Discussions similaires

  1. problème de conversion UTF -> iso
    Par Empty_body dans le forum Général Java
    Réponses: 15
    Dernier message: 01/08/2008, 16h57
  2. conversion utf-8 to windows-1256
    Par bailamos dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 28/04/2008, 14h50
  3. Encodage : Conversion UTF-8 vers ISO-8859-?
    Par polo54 dans le forum Général Java
    Réponses: 6
    Dernier message: 26/06/2007, 19h10
  4. Conversion utf-8 an code ascii
    Par Haplo2006 dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2007, 10h11
  5. Conversion UTF => ISO
    Par komoku dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2007, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo