[java] ChangedCharSetException [RESOLU]

ChangedCharSetException [RESOLU] [java] - Java - Programmation

Marsh Posté le 23-09-2005 à 20:59:20    

Bonsoir,
 
j'ai un petit probleme de ChangedCharSetException.
 
voila les lignes en questions :
 

Code :
  1. Reader urlReader = new BufferedReader (
  2.                            (new InputStreamReader (fileURL.openStream ())));
  3.       // Création d'une instance de parser
  4.       HTMLDocumentLinks doc = new HTMLDocumentLinks (fileURL,1);


 
En fait j'ouvre un document url, (qui est un document html), et je le parse avec un reader qui herite de HTMLEditorKit.ParserCallback.
 
Si le document html ouvert contiens la ligne :
 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" lang="fr">
 
j ai l'exception ChangedCharSetException qui se declenche.
par contre si la ligne est absente il n'y a aucun probleme.
 
J'aimerais savoir comment empecher ce zigoto de changer mon charset tout seul, et surtout savoir coment on empeche cette erreur de se déclencher.
 
Merci beaucoup de votre aide.


Message édité par patastronch le 24-09-2005 à 21:09:11
Reply

Marsh Posté le 23-09-2005 à 20:59:20   

Reply

Marsh Posté le 24-09-2005 à 19:19:20    

cher ami, j'ai une mauvaise nouvelle pour vous !
HTML/XML et leurs amis sont des formats binaires !
 
ils ne faut donc pas les prendre en format caratère (reader), mais en binaire (stream).
 
Plus particulièrement, si on présente un fichier html à un parser en prétenant qu'il a un certain encoding (par un reader), et qu'un encoding est spécifié dans le fichier, et qu'ils ne se correspondent pas, le parser doit envoyer une exception ... c'est ce qu'il fait.
 
La bonne nouvelle, c'est que votre parser respecte ce point de la norme.

Reply

Marsh Posté le 24-09-2005 à 19:51:51    

Ok je me serais bien passé de la bonne nouvelle :)
 
Donc en cllair (pour un débutant en java :s) je fais comment pour lire en binaire ? moi ja i rien choisi , j ai que la methde read() dans HTMLEditorKit.ParserCallback .
 
Si tu  pouvais meclairer un peu plus sur la maniere de faire je t en serais reconnaissant :p car je vois pas du tout comment récuperer lexception pour qu'elle soit ignoré ...a moins qu on puisse dire a une méthode d'ignorer une exeption qu'elle peut envoyer ? ( j en doute mais sait on jamais :p )

Reply

Marsh Posté le 24-09-2005 à 19:57:17    

file-moi un peu plus de code stp, je connais pas le toolkit.

Reply

Marsh Posté le 24-09-2005 à 20:23:59    

Code :
  1. import java.io.*;
  2. import java.net.*;
  3. import javax.swing.text.*;
  4. import javax.swing.text.html.*;
  5. // Classe dérivée de HTMLDocument pour permettre de spécifier
  6. // un reader différent dans la méthode getReader ()
  7. public class HTMLDocumentTable extends HTMLDocument
  8. {
  9. // variables pour trouver le n ieme tableau
  10. int tableNum=1; 
  11. int numTableCherche;
  12.         // countTable permetra de s'assurer qu 'on est pas dans un tableau imbriqué dans un autre.
  13. int countTable=0;
  14.        // les debloks vont permetre de metre des verrous sur les tableau imbriqué au tableau que l on parse.
  15.         // vrai si le tableau en cours est a parser.
  16. boolean deblokTable=false;
  17.         // vrai si la ligne en cours est a parser
  18. boolean deblokTr=false;
  19.         // vrai si la case en cours est a parser
  20. boolean deblokTd=false;
  21.         // taille du tableau
  22. int lig=0;
  23. int col=0;
  24.         // case en cours d'analyse
  25. int l=0;
  26. int c=0;
  27.         // le tableau qui recupere les dnnées du tableau a parser
  28. String [][] table;
  29.  
  30.   // Constructeur
  31.   public HTMLDocumentTable (URL file,int tabNum)
  32.   {
  33.     // Mémorisation de la base du fichier HTML
  34.     setBase (file);
  35.     numTableCherche=tabNum;
  36.     table = new String[1][1];
  37.   }
  38.  
  39. // modifit la taille d'un tableau de ligMore ligne de plus et colMore colonne de plus
  40.   private String[][] majTab (int ligMore,int colMore)
  41.   {
  42.    String[][] temp;
  43.    if (lig+ligMore>=1) {
  44.     if (col+colMore>=1){
  45.      temp = new String[lig+ligMore][col+colMore];
  46.     }else{
  47.      temp = new String[lig+ligMore][1];
  48.       
  49.     }
  50.    }else if (col+colMore>=1){
  51.     temp = new String[1][col+colMore];
  52.     System.out.println("\nMise A jour du tableau : lig = 1 / col = "+col+" + "+colMore+"\n" );
  53.    }else{
  54.     temp = new String[1][1];
  55.    }
  56.  
  57.    for (int i=0;i<lig;i++){
  58.     for (int j=0;j<col;j++){
  59.      if (table[i][j]==null)
  60.       table[i][j]="";
  61.      temp[i][j]=table[i][j];
  62.     }
  63.    }
  64.    return temp;
  65.   }
  66.   // Méthode outrepassée pour fournir un reader différent
  67.   public HTMLEditorKit.ParserCallback getReader (int pos)
  68.   {
  69.     return new LinkReader ();
  70.   }
  71.   // Les méthodes de cette classe sont rappelées par
  72.   // le parser HTML suivant les différents tag HTML lus.
  73.   private class LinkReader extends HTMLEditorKit.ParserCallback
  74.   {
  75.  
  76.    public void handleError(String errorMsg,int pos) {
  77.  
  78.     System.out.println("fuck off !!! "+errorMsg);
  79.    }
  80.  
  81.     // Méthode appelée quand un tag de début est rencontré
  82.     public void handleStartTag (HTML.Tag tag, MutableAttributeSet att, int pos)
  83.     {
  84.    
  85.       if (tag.equals (HTML.Tag.TABLE) && !deblokTable)  // Tags <TABLE>
  86.       {
  87.         if (tableNum == numTableCherche) {
  88.          deblokTable=true;
  89.          l=0;
  90.          c=0;
  91.          }else{
  92.          tableNum++;
  93.         }
  94.       }else if (tag.equals (HTML.Tag.TABLE) && deblokTable) {
  95.        countTable++;
  96.       }else if (tag.equals (HTML.Tag.TR) && deblokTable && countTable==0)  // Tags <TR>
  97.       {
  98.        deblokTr=true;
  99.        table=majTab(1,0);
  100.        lig++;
  101.        l++;
  102.        c=0;
  103.        }else if ((tag.equals(HTML.Tag.TD) || tag.equals (HTML.Tag.TH)) && deblokTr && countTable==0)  // Tags <TD>
  104.       {
  105.        deblokTd=true;
  106.        if (col==c){
  107.         table=majTab(0,1);
  108.         col++;
  109.        }
  110.        c++;
  111.       }
  112.      
  113.      
  114.      
  115.     }
  116.    
  117.  
  118.    
  119.    
  120.     public void handleEndTag (HTML.Tag tag,int pos)
  121.     {   
  122.    
  123.      if ((tag.equals (HTML.Tag.TD) || tag.equals (HTML.Tag.TH)) && deblokTr && countTable==0)  // Tags <TD>
  124.       deblokTd=false;
  125.    
  126.      if (tag.equals (HTML.Tag.TR) && deblokTable && countTable==0)
  127.       deblokTr=false;
  128.    
  129.      if (tag.equals (HTML.Tag.TABLE) && deblokTable && countTable==0)
  130.       deblokTable=false;
  131.    
  132.      if (tag.equals (HTML.Tag.TABLE) && countTable>0)
  133.       countTable--;   
  134.     }
  135.    
  136.    
  137.     public void handleText(char[] data,int pos)
  138.     {   
  139.      if (deblokTd){
  140.       if (table[l-1][c-1]==null)
  141.    table[l-1][c-1]="";
  142.       for (int i=0;i<data.length;i++){
  143.        table[l-1][c-1]=table[l-1][c-1]+Character.toString(data[i]);
  144.       }
  145.      }
  146.     }
  147.    
  148.    
  149.    
  150.   }
  151.  
  152.  
  153.   public static void main (String args [])
  154.   {
  155.    String ligne=""; // pour l affichage finale
  156.     try
  157.     {
  158.  
  159.      URL    fileURL = new URL ("file:C:/tip3.html" );
  160.      Reader urlReader = new BufferedReader (
  161.                 new InputStreamReader (fileURL.openStream ()));
  162.      // Création d'une instance de parser
  163.      // le 1 signifie que le premier tableau seulement sera parsé
  164.      HTMLDocumentTable doc = new HTMLDocumentTable (fileURL,1);
  165.    
  166.      // Parsing du fichier HTML avec Swing
  167.      new HTMLEditorKit ().read (urlReader, doc, 0);
  168.      urlReader.close ();
  169.      
  170.      System.out.println ("\n\n\nTableau :\n\n" );
  171.      
  172.      for (int i=0;i<doc.lig;i++){
  173.       for (int j=0;j<doc.col;j++){
  174.        ligne+="|"+doc.table[i][j];
  175.       }
  176.         System.out.println (ligne+"\n" );
  177.         ligne="";
  178.      }
  179.      
  180.     }
  181.     catch (ChangedCharSetException e)
  182. {
  183.      System.out.println ("ChangedCharSetException :"+((ChangedCharSetException)e).getCharSetSpec());
  184.      e.printStackTrace();
  185. }
  186.     catch (BadLocationException e)
  187. {
  188.      System.out.println ("cool top bad !" );
  189. }
  190.    
  191.     catch (IOException e)
  192.     {
  193.       System.out.println ("IO exeption:"+e);
  194.     }
  195.   }
  196. }


 
 
Bon je sais je programme tres mal ...


Message édité par patastronch le 24-09-2005 à 20:43:59
Reply

Marsh Posté le 24-09-2005 à 20:59:11    


Bon j'ai trouvé une solution, je sais pas si c est du tres propre mais bon ca marche.
 
Je la met ici pour ceux qui tomberait sur ce probleme (je sais je sais, je programme tres mal) et qui serait interessé par comment faire :
 
 

Code :
  1. import java.io.*;
  2. import java.net.*;
  3. import javax.swing.text.*;
  4. import javax.swing.text.html.*;
  5. // Classe dérivée de HTMLDocument pour permettre de spécifier
  6. // un reader différent dans la méthode getReader ()
  7. public class TableHTMLParser extends HTMLDocument
  8. {
  9. // variables pour trouver le n ieme tableau
  10. int tableNum=1;
  11. int numTableCherche;
  12. //countTable permetra de s'assurer qu 'on est pas dans un tableau imbriqué dans un autre.
  13. int countTable=0;
  14. //les debloks vont permetre de metre des verrous sur les tableau imbriqué au tableau que l on parse.
  15. boolean deblokTable=false;
  16. boolean deblokTr=false;
  17. boolean deblokTd=false;
  18. // taille du tableau
  19. int lig=0;
  20. int col=0;
  21. // case en cours d'analyse
  22. int l=0;
  23. int c=0;
  24. // tableau
  25. String [][] table;
  26. // reader
  27. LinkReader readeur = new LinkReader();
  28.  
  29.   // Constructeur
  30.   public TableHTMLParser (URL file,int tabNum)
  31.   {
  32.     // Mémorisation de la base du fichier HTML
  33.     setBase (file);
  34.     numTableCherche=tabNum;
  35.     table = new String[1][1];
  36.   }
  37.  
  38. // permet de modifier la taille du tableau de ligMore ligne de plus et de colMore colonne de plus
  39.   private String[][] majTab (int ligMore,int colMore)
  40.   {
  41.    String[][] temp;
  42.    if (lig+ligMore>=1) {
  43.     if (col+colMore>=1){
  44.      temp = new String[lig+ligMore][col+colMore];
  45.     }else{
  46.      temp = new String[lig+ligMore][1];
  47.       
  48.     }
  49.    }else if (col+colMore>=1){
  50.     temp = new String[1][col+colMore];
  51.    }else{
  52.     temp = new String[1][1];
  53.    }
  54.  
  55.    for (int i=0;i<lig;i++){
  56.     for (int j=0;j<col;j++){
  57.      if (table[i][j]==null)
  58.       table[i][j]="";
  59.      temp[i][j]=table[i][j];
  60.     }
  61.    }
  62.    return temp;
  63.   }
  64.   // Méthode outrepassée pour fournir un reader différent
  65.   public HTMLEditorKit.ParserCallback getReader (int pos)
  66.   {
  67.     return new LinkReader ();
  68.   }
  69.  
  70.  
  71.   // Les méthodes de cette classe sont rappelées par
  72.   // le parser HTML suivant les différents tag HTML lus.
  73.   private class LinkReader extends HTMLEditorKit.ParserCallback
  74.   {
  75.  
  76.  
  77.     // Méthode appelée quand un tag de début est rencontré
  78.     public void handleStartTag (HTML.Tag tag, MutableAttributeSet att, int pos)
  79.     {
  80.    
  81.       if (tag.equals (HTML.Tag.TABLE) && !deblokTable)  // Tags <TABLE>
  82.       {
  83.         if (tableNum == numTableCherche) {
  84.          deblokTable=true;
  85.          l=0;
  86.          c=0;
  87.          }else{
  88.          tableNum++;
  89.         }
  90.       }else if (tag.equals (HTML.Tag.TABLE) && deblokTable) {
  91.        countTable++;
  92.       }else if (tag.equals (HTML.Tag.TR) && deblokTable && countTable==0)  // Tags <TR>
  93.       {
  94.        deblokTr=true;
  95.        table=majTab(1,0);
  96.        lig++;
  97.        l++;
  98.        c=0;
  99.        }else if ((tag.equals(HTML.Tag.TD) || tag.equals (HTML.Tag.TH)) && deblokTr && countTable==0)  // Tags <TD>
  100.       {
  101.        deblokTd=true;
  102.        if (col==c){
  103.         table=majTab(0,1);
  104.         col++;
  105.        }
  106.        c++;
  107.       }
  108.      
  109.      
  110.      
  111.     }
  112.    
  113.  
  114.    
  115.    
  116.     public void handleEndTag (HTML.Tag tag,int pos)
  117.     {   
  118.    
  119.      if ((tag.equals (HTML.Tag.TD) || tag.equals (HTML.Tag.TH)) && deblokTr && countTable==0)  // Tags <TD>
  120.       deblokTd=false;
  121.    
  122.      if (tag.equals (HTML.Tag.TR) && deblokTable && countTable==0)
  123.       deblokTr=false;
  124.    
  125.      if (tag.equals (HTML.Tag.TABLE) && deblokTable && countTable==0)
  126.       deblokTable=false;
  127.    
  128.      if (tag.equals (HTML.Tag.TABLE) && countTable>0)
  129.       countTable--;   
  130.     }
  131.    
  132.    
  133.     public void handleText(char[] data,int pos)
  134.     {   
  135.      if (deblokTd){
  136.       if (table[l-1][c-1]==null)
  137.    table[l-1][c-1]="";
  138.       for (int i=0;i<data.length;i++){
  139.        table[l-1][c-1]=table[l-1][c-1]+Character.toString(data[i]);
  140.       }
  141.      }
  142.     }
  143.     public void handleEndOfLineString(String eol) 
  144.     {
  145.      String ligne="";
  146.    
  147.      for (int i=0;i<lig;i++){
  148.       for (int j=0;j<col;j++){
  149.        ligne+="|"+table[i][j];
  150.       }
  151.       System.out.println (ligne+"\n" );
  152.       ligne="";
  153.      }
  154.     }
  155.    
  156.    
  157.   }
  158.  
  159.   private static void parse(URL url, String encoding) throws IOException {
  160.    ParserGetter kit = new ParserGetter();
  161.     HTMLEditorKit.Parser parser = kit.getParser();
  162.     InputStream in = url.openStream();
  163.     InputStreamReader r = new InputStreamReader(in, encoding);
  164.     TableHTMLParser doc = new TableHTMLParser(url,1);
  165.     parser.parse(r, (HTMLEditorKit.ParserCallback)doc.readeur, true);
  166.    
  167.    
  168.   }
  169.  
  170.   public static void main(String[] args) {
  171.    ParserGetter kit = new ParserGetter();
  172.     HTMLEditorKit.Parser parser = kit.getParser();   
  173.  
  174.     String encoding = "ISO-8859-1";
  175.     URL url = null;
  176.     try {
  177.      url = new URL ("file:C:/tip3.html" );
  178.      InputStream in = url.openStream();
  179.      InputStreamReader r = new InputStreamReader(in,encoding);
  180.      
  181.      // on parse une premiere fois pour connaitre l'encoding
  182.      HTMLEditorKit.ParserCallback doNothing = new HTMLEditorKit.ParserCallback();
  183.      parser.parse(r, doNothing, false);
  184.      
  185.    
  186.      
  187.     }
  188.     catch (MalformedURLException ex) {
  189.      System.err.println(ex);
  190.      return;
  191.     }
  192.     catch (ChangedCharSetException ex) {
  193.      String mimeType = ex.getCharSetSpec();
  194.      encoding = mimeType.substring(mimeType.indexOf("=" ) + 1).trim();
  195.     }
  196.     catch (IOException ex) {
  197.      System.err.println(ex);
  198.     }
  199.     catch (ArrayIndexOutOfBoundsException ex) {
  200.      System.err.println(ex);
  201.      return;
  202.     }
  203.    
  204.     try {
  205.      parse(url, encoding);
  206.     }
  207.     catch(IOException ex) {
  208.      System.err.println(ex);
  209.     }
  210.          
  211.   }
  212. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed