Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Probleme JAVA sous PHP
Envoyé par: Jérôme54

Bonjour,

J'ai un souci lorsque j'exécute un programme JAVA dans un script PHP lancé depuis un navigateur (le serveur est un serveur linux).
Tous les caractères spéciaux (tels que les acccents) traités en entrée-sortie (écriture de fichiers, sortie standard, récupération de source HTML, ...) sont tout simplement remplacés par des points d'interrogation.

Ce problème n'apparait pas quand je lance le programme JAVA en ligne de commande, ni lorsque j'excécute le script PHP en ligne de commande directement dans une console. De plus, ce problème n'apparait pas sur un serveur Windows.

Pouvez-vous m'aider?
Merci d'avance.

Poste le Saturday 2 April 2005 14:14:40
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Morgan

C'est difficile de te répondre sans voir ton code et sans savoir ce qu'il fait mais a priori, je pencherais pour un problème de charset non/mal pris en charge par ton serveur (je ne sais pas précisément à quoi c'est du mais j'ai déjà constaté ce genre de choses). essaie de tout convertir en entités html:

[fr.php.net]

Si la page est généré par le java, c'st à voir selon les apis utilisés (javax.swing.text.HTML ?), le plus simple est peut-être de retourner la sortie dans une chaine de caractéres et de lui appliquer htmlentites en php.

___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Saturday 2 April 2005 14:58:32
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

J'ai fait un bête test pour cerner le problème, le fichier PHP ne contient que l'appel du programme JAVA : exec("java TestCarac");

Ce programme JAVA se connecte à un site et récupère le code HTML dans une chaine de caractères (via la classe HttpURLConnection). Déjà à ce niveau là, tous les accents sont saccagés. La conversion de cette chaine de caractères en entités HTML n'a donc aucun n'effet.

Poste le Saturday 2 April 2005 15:09:55
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Morgan

Et si tu modifies la classe java de façon à récupérer le charset utilisé:
[java.sun.com]()

et que tu généres la balise <meta http-equiv="Content-Type" > dynamiquement en fonction du résultat ?

Tu aurais un charset correspondant au texte d'origine déjà, non ?

Si tu me montrais le code java ou que tu m'expliques un peu plus précisément ce qu'il fait, ce serait plus facile, je pense.

___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Saturday 2 April 2005 15:34:10
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

Voici le code JAVA :

-------------------------------------------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class TestCarac {

private String[] caracteres = {"\"", "<", ">", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "ÿ", "Œ", "œ", "Ÿ", "ˆ", "˜", "€", "™"};
private String[] entitesHTML = {"&quot;", "&lt;", "&gt;", "&iexcl;", "&cent;", "&pound;", "&curren;", "&yen;", "&brvbar;", "&sect;", "&uml;", "&copy;", "&ordf;", "&laquo;", "&not;", "&shy;", "&reg;", "&macr;", "&deg;", "&plusmn;", "&sup2;", "&sup3;", "&acute;", "&micro;", "&para;", "&middot;", "&cedil;", "&sup1;", "&ordm;", "&raquo;", "&frac14;", "&frac12;", "&frac34;", "&iquest;", "&Agrave;", "&Aacute;", "&Acirc;", "&Atilde;", "&Auml;", "&Aring;", "&AElig;", "&Ccedil;", "&Egrave;", "&Eacute;", "&Ecirc;", "&Euml;", "&Igrave;", "&Iacute;", "&Icirc;", "&Iuml;", "&ETH;", "&Ntilde;", "&Ograve;", "&Oacute;", "&Ocirc;", "&Otilde;", "&Ouml;", "&times;", "&Oslash;", "&Ugrave;", "&Uacute;", "&Ucirc;", "&Uuml;", "&Yacute;", "&szlig;", "&agrave;", "&aacute;", "&acirc;", "&atilde;", "&auml;", "&aring;", "&aelig;", "&ccedil;", "&egrave;", "&eacute;", "&ecirc;", "&euml;", "&igrave;", "&iacute;", "&icirc;", "&iuml;", "&eth;", "&ntilde;", "&ograve;", "&oacute;", "&ocirc;", "&otilde;", "&ouml;", "&divide;", "&oslash;", "&ugrave;", "&uacute;", "&ucirc;", "&uuml;", "&yacute;", "&yuml;", "&OElig;", "&oelig;", "&Yuml;", "&circ;", "&tilde;", "&euro;", "&trade;"};



public TestCarac() {
testHTML();
}


public void testHTML(){
System.out.println("Test HTML : ");
System.out.println("Récupération du code HTML...");
String source = recupHTML();
if (source.indexOf("acidulé") != -1){
System.out.println(" * mot acidulé trouvé dans le source\n");
}
else {
System.out.println(" * mot acidulé non trouvé dans le source\n");
}
if (source.indexOf("maraîcher") != -1){
System.out.println(" * mot maraîcher trouvé dans le source\n");
}
else {
System.out.println(" * mot maraîcher non trouvé dans le source\n");
}
try{
System.out.println("Ecriture du source dans fichier.");
BufferedWriter file = new BufferedWriter(new FileWriter("testHTML.txt"));
file.write(source);
file.newLine();
file.newLine();
file.flush();
System.out.println("Ecriture du source encodé dans fichier.");
file.write(encoder(source));
file.flush();
file.close();
}catch(Exception e) {
System.out.println(e.getMessage() + "\nErreur d'écriture du fichier testHTML.txt");
}

try {
System.out.println("Lecture du source depuis le fichier.");
BufferedReader br = new BufferedReader(new FileReader("testHTML.txt"));
String chaine="", ligne;
while ((ligne = br.readLine()) != null) {
chaine += ligne;
}
if (chaine.indexOf("acidulé") != -1){
System.out.println(" * mot acidulé trouvé dans le source\n");
}
else {
System.out.println(" * mot acidulé non trouvé dans le source\n");
}
if (chaine.indexOf("maraîcher") != -1){
System.out.println(" * mot maraîcher trouvé dans le source\n");
}
else {
System.out.println(" * mot maraîcher non trouvé dans le source\n");
}
br.close();
}catch (Exception e) {
System.out.println(e.getMessage() + "\nErreur de lecture du fichier testHTML.txt");
}
}

public String recupHTML(){
String source = "";
try {
URL adresse = new URL("[www.legumes.ch]winking smiley;
// Etablissement de la connexion
HttpURLConnection connexion = (HttpURLConnection)adresse.openConnection();

// Récupération du code source
InputStream is = connexion.getInputStream();
int sizeRead;
int sizeAvailable = is.available();
if (sizeAvailable == 0){
sizeAvailable = 7719;
}
byte[] b = new byte[sizeAvailable];
while ((sizeRead = is.read(b)) != -1){
source += new String(b, 0, sizeRead);
b = new byte[sizeAvailable];
}
connexion.disconnect();
}
catch (Exception e) {
System.out.println(e.getMessage() + "\nErreur de récupération de code source.");
}
return source;
}


public String encoder(String chaine){
for (int i=0 ; i<caracteres.length ; i++){
chaine = chaine.replaceAll(caracteres, entitesHTML);
}
return chaine;
}

public static void main(String[] args) {
new TestCarac();
}
}
-------------------------------------------


et donc aucun des mots recherchés n'est trouvé...
merci

Poste le Saturday 2 April 2005 15:42:16
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Morgan

ok, ça va mieux comme cela. Effectivement, ton serveur ne prend pas en charge cette encodage car il s'agit d'un charset windows-1252 et de plus, dans le fichier d'origine, la balise <meta http-equiv="Content-Type" > n'existe pas (voilà pourquoi cela marche sur un serveur windows).

Plusieurs possibilités:

soit tu utilises une page d'un site codé convenablement avec une balise meta qui renseigne un charset convenable (iso ou utf) et pas un site codé par un concombre. :-p (hum, bon d'accord, j'ai pas pu m'empêcher)

soit si tu veux une classe java qui marche dans tous les cas, il faut revoir la conception àmha car ta méthode pour remplacer les caractéres spéciaux en entités html ne peut pas fonctionner. Puisque elle a pour objet du code html, tu convertis aussi les caractéres qui représentent les balises (les caractéres <, > par exemple, c'est à cause de cela que tes tests sur les mots recherchés ne marchent pas, enlèves ces deux caractéres de la chaîne caractéres, tu verras...).

Si tu choisis la seconde solution, tu devras fixer toi-meme le charset de ta page (en utf-8, ce sera le plus simple pour le traitement java) et tu modifies l'encodage du texte complet avant de l'écrire dans ton fichier. Pour cela, la classe java.nio.charset.CharsetDecoder sera ton amie.

Dans ce cas, convertir les caractéres spéciaux en entités html ne sera plus utile car le charset sera indiqué dans les meta du code html, et sera standard (pas windows machin-truc).

Bon courage. ;-)


___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Saturday 2 April 2005 18:04:08
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

merci pour ces précisions.

En fait, ceci doit rentrer dans le cadre d'un moteur de recherche, donc toutes les pages doivent être traitées...

Le problème viendrait d'apache alors ? Il n'est pas possible d'ajouter une ligne dans le fichier de config pour qu'il prenne en compte cet encodage?
Parce que ce que je n'arrive pas à comprendre, c'est que le programme marche en le lançant en ligne de commande "php mon_script.php" et il reconnait bien l'encodage de la page.

Pour la deuxième solution, même en enlevant ces caratères, le problème est toujours là, car dès la récupération des pages HTML dans la chaîne de caractères (avant même de la sauvegarder) les accents sont déjà sucrées.

Je désespère... :-(

Poste le Saturday 2 April 2005 19:20:28
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

encore une précision :

J'ai essayé avec ce site :
[www.livres-online.com]

(oui, je sais, c'est encore du concombre @:-))

le charset y est précisé, et pourtant j'ai toujours le même problème, les accents sont sucrés...

Poste le Saturday 2 April 2005 20:08:26
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Morgan

Chez moi, ça marche mais j'ai enlevé l'appel de la méthode encoder(String chaine) et la page s'affiche bien. Dans ce cas, tu as certainement un problème avec la config d'apache, il faut voir les entêtes http envoyés pour être sur.

De toute façon, si tu veux que cela marche pour toutes les pages, je pense que la solution propre est de revoir la conception comme je te le suggérais au-dessus et de modifier l'encodage du fichier avec java, cela t'évitera pas mal de surprises: tu seras sur que toutes les pages auront le même encodage.
De cette façon, tu peux par exemple dans ton fichier php créer toi-même les entêtes http et ne traiter en java que le body du fichier html distant. De plus, cette méthode me semble meilleure d'un point de vue sécurité car tu contrôles le contenu des entêtes http que ton serveur envoies.

___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Saturday 2 April 2005 20:25:27
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

je l'ai essayé chez 2 personnes différentes, il ne marche pas... :-(

Je suis d'accord pour ta solution pour l'écriture d'une page, mais même ce qu'il y a dans le body est saccagé dès récupération du code HTMLconnexion.getInputStream().

Poste le Saturday 2 April 2005 21:05:38
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

Pour te dire, même sans parler de connexion ou de code source,

J'ai un mini programme JAVA qui lis un fichier texte contenant des accents. Même dans ce cas là, les accents sont sucrés.

Poste le Saturday 2 April 2005 21:22:04
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Morgan

Avec quoi tu lis les fichiers résultants ? Tu es sur que ton fichier est correctement interprété ?
parce que je viens de constater un truc curieux: quand je lis le fichier résultant dans un éditeur comme gedit ou bluefish, il me détecte iso-8859-15 comme encodage. Par contre, si je change l'extension de .txt en .html et que je l'ouvre dans firefox, celui ci détecte un charset windows-1252. ?-(

___________________________________________________
L'interface chaise-clavier se débuggue elle aussi...

Poste le Saturday 2 April 2005 22:12:10
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

Voici mon mini programme (plus simple on ne peut pas) :

------------------------------------------------
import java.io.*;

public class Carac {

public static void main(String[] args){
String chaine = "Phrase accentuée à volonté.";
try {
BufferedWriter file = new BufferedWriter(new FileWriter("testSimple.html"));
file.write(chaine);
file.close();
}catch(Exception e){}
try {
BufferedReader br = new BufferedReader(new FileReader("testSimple.html"));
String source = br.readLine();
System.out.println(source);
if (source.indexOf("accentuée") != -1){
System.out.println("trouvé");
}
else
System.out.println("non trouvé");
br.close();
}catch(Exception e){}
}
}
------------------------------------------------

Le mot "accentuée" n'est pas trouvé lorsque je lance ce programme depuis une page PHP. Et dans le fichier, j'obtiens : "Phrase accentu?e ? volont?." et ça, que je le lise par vi, ou par un navigateur.

Poste le Sunday 3 April 2005 12:25:16
Répondre     Citer    
Re: Probleme JAVA sous PHP
Envoyé par: Jérôme54

je te mets également ma page PHP, très simple comeme tu peux le constater :

<?php
$a = array();
exec("java Carac",$a);
print_r($a);
?>

Poste le Sunday 3 April 2005 12:31:21
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Probleme JAVA sous PHP
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons