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

avec Java Discussion :

Problème charset UTF 8


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut Problème charset UTF 8
    Hi,

    j'aimerais arriver à une fonction qui détecte le charset d'un fichier.

    Pour cela je me suis appuié de ce table :

    U-00000000 – U-0000007F: 0xxxxxxx
    U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
    U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
    U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    qui décrit toutes les combinaisons d'octets possibles.

    Pour le moment mon code ressemble à celui-ci :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    // TODO Auto-generated method stub
    		FileReader fileToRead = new FileReader(new File("file"));
     
    		Integer byteInInt;
    		String byteInBin;
    		Integer sequenceExpected = 0; // Sequence encore attendues qui commencent par 10
     
    		boolean rater = false;
    		while((byteInInt = fileToRead.read()) != -1) {
     
    			byteInBin = Integer.toBinaryString(byteInInt);
    			System.out.println(byteInInt);
    			System.out.println(byteInBin);
     
    			if (byteInBin.length() == 8) {
    				if (byteInBin.charAt(0) == '0'
    				 	&& sequenceExpected == 0) {
    				}
    				else if (byteInBin.charAt(0) == '1'
    					&& byteInBin.charAt(1) == '1'
    				 	&& byteInBin.charAt(2) == '0'
    				 	&& sequenceExpected == 0) {
    					sequenceExpected = 1;
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 2;
     
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '1'
    					 	&& byteInBin.charAt(4) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 3;
     
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '1'
    				 		&& byteInBin.charAt(4) == '1'
    				 		&& byteInBin.charAt(5) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 4;
     
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '1'
    				 		&& byteInBin.charAt(4) == '1'
    				 		&& byteInBin.charAt(5) == '1'
    				 		&& byteInBin.charAt(6) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 5;
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '0') {
    					sequenceExpected--;
    				}
    				else {
    					rater = true;
    				}
    			}
    			else if (byteInBin.length() > 8) {
    				rater = true;
    			}
    			else if (byteInBin.length() < 8) {
    				if (sequenceExpected != 0) {
    					rater = true;
    				}
    			}
    			if (rater) {
    				//System.exit(0);
    			}
    		}
    		if (!rater) {
    			System.out.println("UTF-8");
    		}
    		else {
    			System.out.println("PAS UTF-8");
    		}
    Cela semble fonctionner. J'ai tout de même pu observer que certains caractères était incorrecte.

    Par exemple si le fichier (sans BOM) contient juste le symbole euro : € voici ce que j'obtient :

    226
    11100010
    8218
    10000000011010
    172
    10101100
    PAS UTF-8

    J'ai pu voir que cela était le cas pour d'autres symboles.

    Je ne comprends pas pourquoi la 2eme sequence contient autant de bit ...

    Quelqu'un pourrait m'éclairer ?

    sources : http://www.cl.cam.ac.uk/~mgk25/unicode.html

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si tu veux accéder au document en binaire, utilise un FileInputStream et pas un FileReader. Le filereader dans ton cas va déjà interpréter les fichier en utilisant l'encodage par défaut de ta plateforme. Si ton fichier est utf-8 et que l'encodage par défaut est iso-8859-1, tu va avoir n'importe quoi.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    Oh Merci je m'attendais pas à ce que cela soit si rapidement résolu.

    Par contre, mon code était faux, il faut qu'à la fin je test si toutes les chaines commençant pas 10 sont bien arrivé. Ce qui semble fonctionner et qui donne cela :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    FileInputStream  fileToRead = new FileInputStream (new File("file"));
     
    		Integer byteInInt;
    		String byteInBin;
    		Integer sequenceExpected = 0; // Sequence encore attendues qui commencent par 10
     
    		boolean rater = false;
    		while((byteInInt = fileToRead.read()) != -1) {
     
    			byteInBin = Integer.toBinaryString(byteInInt);
    			System.out.println(byteInInt);
    			System.out.println(byteInBin);
    			if (byteInBin.length() == 8) {
    				if (byteInBin.charAt(0) == '0'
    				 	&& sequenceExpected == 0) {
    				}
    				else if (byteInBin.charAt(0) == '1'
    					&& byteInBin.charAt(1) == '1'
    				 	&& byteInBin.charAt(2) == '0'
    				 	&& sequenceExpected == 0) {
    					sequenceExpected = 1;
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 2;
     
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '1'
    					 	&& byteInBin.charAt(4) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 3;
     
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '1'
    				 		&& byteInBin.charAt(4) == '1'
    				 		&& byteInBin.charAt(5) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 4;
     
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '1'
    					 	&& byteInBin.charAt(2) == '1'
    					 	&& byteInBin.charAt(3) == '1'
    				 		&& byteInBin.charAt(4) == '1'
    				 		&& byteInBin.charAt(5) == '1'
    				 		&& byteInBin.charAt(6) == '0'
    						&& sequenceExpected == 0) {
    					sequenceExpected = 5;
    				}
    				else if (byteInBin.charAt(0) == '1'
    						&& byteInBin.charAt(1) == '0') {
    					sequenceExpected--;
    				}
    				else {
    					rater = true;
    				}
    			}
    			else if (byteInBin.length() > 8) {
    				rater = true;
    			}
    			else if (byteInBin.length() < 8) {
    				if (sequenceExpected != 0) {
    					rater = true;
    				}
    			}
    		}
     
    		if (sequenceExpected != 0) {
    			rater = true;
    		}
    		if (!rater) {
    			System.out.println("UTF-8");
    		}
    		else {
    			System.out.println("PAS UTF-8");
    		}
    Si certains voient une erreure rapidement dites le moi

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par einboubou Voir le message
    Si certains voient une erreure rapidement dites le moi
    travailler sur une chaine de 11001100 plutot que de manipuler le document binaire directement, c'est un peu de l'overkill!

    par exemple, ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    byteInBin = Integer.toBinaryString(byteInInt);
    ....
        if (byteInBin.charAt(0) == '1'
    	&& byteInBin.charAt(1) == '1'
    	&& byteInBin.charAt(2) == '1'
    	&& byteInBin.charAt(3) == '1'
    	&& byteInBin.charAt(4) == '0'
    	&& sequenceExpected == 0)
    peux facilement etre changé par ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if  ( ((byteInInt & 11111000b) == 11110000) && sequenceExpected == 0)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    ok merci tu as raison

    je change ça de suite.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut
    j'obtiens une erreur à cause du 'b' ici : 11111000b

    J'ai cherché un peu partout je trouve pas la syntaxe pour indiqué qu'un nombre est binaire.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    mes excuse, il n'y a pas de notation binaire en java. Utilise cette notation hexa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((byteInInt & 0xF8) == 0xF0)

Discussions similaires

  1. charset UTF-8 problème
    Par GiggZCQA dans le forum Administration
    Réponses: 2
    Dernier message: 12/10/2011, 22h18
  2. Problème de Charset UTF-8
    Par Lost In Translation dans le forum Apache
    Réponses: 3
    Dernier message: 30/10/2008, 17h08
  3. Bonjour, JSP avec Charset UTF-8 Problème
    Par chakcc dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2007, 11h45
  4. [XSLT] XML+XSL=HTML avec charset UTF-16
    Par Steph4fun dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/10/2006, 07h54
  5. [Conception] utf8_decode() ou charset=utf-8
    Par viny dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/09/2006, 17h13

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