Bonjour 8-)


Je cherche une petit shoutbox pour mon site, et je suis tombé sur un vieux projet open source que voici: https://github.com/metachris/most-simple-ajax-chat-ever


Meme si ça date ça marche bien et c'est exactement ce que je veux, quelque chose de simple a utiliser sans passer par MySql.Trois fichiers seulement sont nécessaires, un fichier html, un fichier php et un fichier texte pour enregistrer les messages, le code javascript est dans le fichier html.

IL y a du boulot pour rendre ça plus jolie mais ça marche, sauf pour les caractères suivants : é à è ç

Problème de lecture de format, j'ai donc rajouté ceci dans mon fichier html:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
Et dans mon fichier php a la première ligne avant le traitement des données:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
header('Content-Type: text/html; charset=utf-8');

Malgré ces modification je continu a voir mes accents qui s'affichent avec un ?.Je suis sous linux avec apache2 donc après avoir vérifié que mes fichiers étaient bien enregistrés en utf-8, je me suis aperçu que le fichier texte "chat.txt" se converti en iso-8859-1 a chaque message envoyé dans la shoutbox.Avant que je poste un message:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
file -i *
chat.txt:        text/plain; charset=utf-8
index.html:      text/html; charset=utf-8
w.php:           text/x-php; charset=us-ascii
Et après que j'ai posté un message:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
file -i *
chat.txt:        text/plain; charset=iso-8859-1
index.html:      text/html; charset=utf-8
w.php:           text/x-php; charset=us-ascii
J'ai donc essayé de modifier le code php pour qui fasse en sorte de me traduire le tout en utf-8 avec ce morceau de code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
function writeUTF8File("chat.txt",$content) { 
        $f=fopen("chat.txt","w"); 
        # Now UTF-8 - Add byte order mark 
        fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
        fwrite($f,$content); 
        fclose($f); 
} 
?>
Et la surprise ça marche mes accents et les caractères spéciaux s'affichent bien... sauf que l'historique du tchat n'est pas gardé, je vois que les deux derniers messages :?

Voici donc le code javascript qui se situe dans la page html:

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
<script type="text/javascript" charset="utf-8">
/* most simple ajax chat script (www.linuxuser.at) (GPLv2) */
contentType: "application/x-www-form-urlencoded;charset=utf-8"
var nick_maxlength=10;
var http_request=false;
var http_request2=false;
var intUpdate;
 
/* http_request for writing */
function ajax_request(url){http_request=false;if(window.XMLHttpRequest){http_request=new XMLHttpRequest();if(http_request.overrideMimeType){http_request.overrideMimeType('text/xml');}}else if(window.ActiveXObject){try{http_request=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{http_request=new ActiveXObject("Microsoft.XMLHTTP");}catch(e){}}}
if(!http_request){alert('Giving up :( Cannot create an XMLHTTP instance');return false;}
http_request.onreadystatechange=alertContents;http_request.open('GET',url,true);http_request.send(null);}
function alertContents(){if(http_request.readyState==4){if(http_request.status==200){rec_response(http_request.responseText);}else{}}}
 
/* http_request for reading */
function ajax_request2(url){http_request2=false;if(window.XMLHttpRequest){http_request2=new XMLHttpRequest();if(http_request2.overrideMimeType){http_request2.overrideMimeType('text/xml');}}else if(window.ActiveXObject){try{http_request2=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{http_request2=new ActiveXObject("Microsoft.XMLHTTP");}catch(e){}}}
if(!http_request2){alert('Giving up :( Cannot create an XMLHTTP instance');return false;}
http_request2.onreadystatechange=alertContents2;http_request2.open('GET',url,true);http_request2.send(null);}
function alertContents2(){if(http_request2.readyState==4){if(http_request2.status==200){rec_chatcontent(http_request2.responseText);}else{}}}
 
/* chat stuff */
chatmsg.focus()
var show_newmsg_on_bottom=1;     /* set to 0 to let new msg´s appear on top */
var waittime=1000;        /* time between chat refreshes (ms) */
 
intUpdate=window.setTimeout("read_cont();", waittime);
chatwindow.value = "loading...";
 
function read_cont()         { zeit = new Date(); ms = (zeit.getHours() * 24 * 60 * 1000) + (zeit.getMinutes() * 60 * 1000) + (zeit.getSeconds() * 1000) + zeit.getMilliseconds(); ajax_request2("chat.txt?x=" + ms); }
function display_msg(msg1)     { chatwindow.value = msg1.trim(); }
function keyup(arg1)         { if (arg1 == 13) submit_msg(); }
function submit_msg()         { clearTimeout(intUpdate); if (chatnick.value == "") { check = prompt("please enter username:"); if (check === null) return 0; if (check == "") check="..."; chatnick.value=check; } if (chatnick.value.length > nick_maxlength) chatnick.value=chatnick.value.substring(0,nick_maxlength); spaces=""; for(i=0;i<(nick_maxlength-chatnick.value.length);i++) spaces+=" "; v=chatwindow.value.substring(chatwindow.value.indexOf("\n")) + "\n" + chatnick.value + spaces + "| " + chatmsg.value; if (chatmsg.value != "") chatwindow.value=v.substring(1); write_msg(chatmsg.value,chatnick.value); chatmsg.value=""; intUpdate=window.setTimeout("read_cont();", waittime);}
function write_msg(msg1,nick1)     { ajax_request("w.php?m=" + escape(msg1) + "&n=" + escape(nick1)); }
function rec_response(str1)     { }
 
function rec_chatcontent(cont1) {
    if (cont1 != "") {
        out1 = unescape(cont1);
        if (show_newmsg_on_bottom == 0) { out1 = ""; while (cont1.indexOf("\n") > -1) { out1 = cont1.substr(0, cont1.indexOf("\n")) + "\n" + out1; cont1 = cont1.substr(cont1.indexOf("\n") + 1); out1 = unescape(out1); } }
        if (chatwindow.value != out1) { display_msg(out1); }
        intUpdate=window.setTimeout("read_cont()", waittime);
    }
}
</script>
Et le code php:

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
88
89
90
91
92
93
94
95
96
97
<?php
header('Content-Type: text/html; charset=utf-8');
    /**
     * Author: chris at linuxuser.at
     * Licence: MIT
     */
    $fn = "chat.txt";
    $maxlines = 1000;
 
    $nick_maxlength = 10;
 
    /* Set this to a minimum wait time between posts (in sec) */
    $waittime_sec = 0;
 
    /* spam keywords */
    $spam[] = "cum";
    $spam[] = "dick";
    $spam[] = "EAT coon";
 
    /* IP's to block */
    $blockip[] = "72.60.167.89";
 
    /* spam, if message IS exactly that string */
    $espam[] = "ajax";
 
    $msg = $_REQUEST["m"];
    $n = $_REQUEST["n"];
 
 
    if ($waittime_sec > 0) {
        $lastvisit = $_COOKIE["lachatlv"];
        setcookie("lachatlv", time());
 
        if ($lastvisit != "") {
            $diff = time() - $lastvisit;
            if ($diff < $waittime_sec) { die(); }
        }
    }
 
    if ($msg != "") {
        if (strlen($msg) < 2) { die(); }
        if (strlen($msg) > 3) {
            /* Smilies are ok */
            if (strtoupper($msg) == $msg) { die(); }
        }
        if (strlen($msg) > 150) { die(); }
        if (strlen($msg) > 15) {
            if (substr_count($msg, substr($msg, 6, 8)) > 1) { die(); }
        }
 
        foreach ($blockip as $a) {
            if ($_SERVER["REMOTE_ADDR"] == $a) { die(); }
        }
 
        $mystring = strtoupper($msg);
        foreach ($spam as $a) {
             if (strpos($mystring, strtoupper($a)) === false) {
                 /* Everything Ok Here */
             } else {
                 die();
             }
        }
 
        foreach ($espam as $a) {
            if (strtoupper($msg) == strtoupper($a)) { die(); }
        }
 
        $handle = fopen ($fn, 'r');
        $chattext = fread($handle, filesize($fn)); fclose($handle);
 
        $arr1 = explode("\n", $chattext);
 
        if (count($arr1) > $maxlines) {
            /* Pruning */
            $arr1 = array_reverse($arr1);
            for ($i=0; $i<$maxlines; $i++) { $arr2[$i] = $arr1[$i]; }
            $arr2 = array_reverse($arr2);
        } else {
            $arr2 = $arr1;
        }
 
        $chattext = implode("\n", $arr2);
 
        // Last spam filter: die if message has already been in the chat history
        if (substr_count($chattext, $msg) > 2) { die(); }
 
        $spaces = "";
        if (strlen($n) > $nick_maxlength-1) $n = substr($n, 0, $nick_maxlength-1);
        for ($i=0; $i<($nick_maxlength - strlen($n)); $i++) $spaces .= " ";
 
        $out = $chattext . $n . $spaces . "| " . $msg . "\n";
        $out = str_replace("\'", "'", $out);
        $out = str_replace("\\\"", "\"", $out);
 
        $handle = fopen ($fn, 'w'); fwrite($handle, $out.trim()); fclose($handle);
} 
?>
En espérant que vous pouvez m'aider a y voir plus clair... ;)