예제는 우선 여기:http://whoami.webzero.co.kr/chat_/small.php

euc-kr 찾는 분이 있어서,, 만들었습니다. (물론 기존꺼 수정해서)

iconv를 많이 쓰게 될줄 알았는데,
별로 안쓰게 됐습니다.

하여튼,, 보여지는 부분은 euc-kr 이고,
보여지지 않는 기능적인 부분은 utf-8입니다.
뭐.. 그래도 브라우저에 인코딩은 euc-kr로 나오니까요......

이걸 인클루드하는 실험은 하지 않았는데,
아마 그냥저냥 될거 같습니다. (물론 euc-kr에)

소스 3줄에,
$chat = "index.php";
이렇게 있는데, 혹시 이걸 팝업등으로 독립적으로 띄우질 않고,
다른 곳에 이 소스를 인클루드할때라도,
처리하는 부분은 인클루드되지 않은, 이 파일 단독으로 작동시키기 위해섭니다.

아래가 소스인데,,, 아래내용을 텍스트에디터에 붙여넣고,
$chat = "index.php";
여기 이름하고 맞춰서 저장하면 됩니다. 저장되는 경로(폴더)의 권한은 777 주시고....

------
icov() -- php에서 텍스트의 인코딩바꾸는 함수 --
함수는 세션에 저장한 닉네임에 사용합니다.
닉네임이 바뀌었는지 계속 확인하니까,, 세션닉네임을 자주 거기서 쓰게 되는데,
그래서 세션닉네임을 UTF-8로 저장했습니다.
그래놓고, 창을 새로고침하거나 할때, 닉네임칸에 자동으로 들어갈 세션닉네임은
인코딩을 euc-kr로 바뀌어서 ... 들어가도록 했구요...

문제가 조금 있는게,
닉네임을 바꿨을때, 닉네임 바뀌었다고 뜨고, 그거 바꾸면서 올린 글이 안보입니다.
F5 새로고침해보면,, 나오는걸로 봐서,
저장이 안된건 아닌데, 읽을때,,, 이상하게 못읽어오는군요..
아마 닉네임을 바꾼 본인에게만 그럴겁니다.
우선은 닉네임 바꾸면 F5 (새로고침) 하세요.....

혹시나 그 문제인가해서,
글 올리는 부분이 ajax함수를 비동기화였던거에서 동기화로 바꿔봤는데,
마찬가지더군요...
어쨌거나,, 이왕 바꿨으니까,, 그건 그대로 갑니다.

<?
session_start();
$chat = "index.php";
if($_POST[xname] || $_GET[tex] || $_GET[delete]){
header ("Content-Type: text/html; charset=UTF-8");
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
if($_POST[xname] && $_POST[text]) {
if(!$_SESSION[name] || $_SESSION[name] != $_POST[xname]) {
$_POST[xname] = str_replace('<', '&lt;', str_replace(' ', '', stripslashes(trim($_POST[xname]))));
$_POST[xname] = preg_replace("` [\s]`i", "", $_POST[xname]);
$_POST[xname] = preg_replace("`[\x1b\x18\x7f\t]`", "", $_POST[xname]);
if($_SESSION[name]) $nickc = "--\x1b<font class=mc><font class=mm>".$_SESSION[name]."</font> ==> <font class=mm>".$_POST[xname]."</font></font>\n";
session_unregister("name");
$name = $_POST[xname];
session_register("name");
}
if($_POST[xname]) {
$_POST[text] = preg_replace("`[\x1b\x18\x7f<]`", "", stripslashes($_POST[text]));
$nickc .= $_POST[xname]."\x1b".$_POST[text]."\n";
$fp = fopen("./_text", "a");
fputs($fp, $nickc);
fclose($fp);
if(filesize("./_text") > 2048) {
$fp = fopen("./_text", "r");
fread($fp, 1536);
fgets($fp);
while(!feof($fp)) $fpo .= fgets($fp);
fclose($fp);
$fp = fopen("./_text", "w");
fputs($fp, $fpo);
fclose($fp);
}
}
exit;
}
if($_GET[tex]) {
if(file_exists("./_text")){
if($_GET[tex] == -1) $_GET[tex] = 0;
$fze = filesize("./_text");
if($fze != $_GET[tex]) {
echo $fze."\x7f";
$fp = fopen("./_text", "r");
while(!feof($fp)) {
if($_GET[tex] && $fze > $_GET[tex]) fread($fp, $_GET[tex]);
if($fpo = trim(fgets($fp))) echo $fpo."\x7f";
}
fclose($fp);
}
}
exit;
}
if($_GET[delete] == "text" && $_SESSION[admin_pass]) {
$fp = fopen("./_text", "w");
fclose($fp);
}
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>채팅방</title>
</head>
<body>
<script>
function go() {
var url = '<?=$chat?>?tex=' + document.getElementsByName('ntim')[0].value;
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
var str = xmlHttp.responseText;
if(str) {
var vew = str.split("\x7f");
allc = vew.length -1;
if(allc > 1) {
document.getElementsByName('ntim')[0].value = vew[0];
if(document.getElementById('AA').innerHTML == '') str = "<table border=0 cellspacing=0 cellpadding=0 width=100% style='margin-bottom:20;table-layout:fixed'>";
else str = "";
for(i = 1;i < allc;i++){
var nam = vew[i].split("\x1b");
str += "<tr class=trh><td class=name>"+ nam[0] +"</td><td width=10>:</td><td class=memo>"+ nam[1] +"</td></tr>";
str += "<tr><td colspan=3 bgcolor=#E6E6E6 height=1><img height=1></td></tr>";
}
str += "</table>";
document.getElementById('AA').innerHTML = document.getElementById('AA').innerHTML.substring(0,document.getElementById('AA').innerHTML.length-8) + str;
document.getElementById('AA').scrollTop = 10000000;
}
} else window.status = '새 글이 없습니다.';
setTimeout('go()', 1000);
delete xmlHttp;
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}

function wte(){
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
var param = '<?=$chat?>?&xname='+ document.getElementsByName("xname")[0].value.replace(/[&'"]/gi,"") +'&text='+ document.getElementsByName("text")[0].value.replace("&","%26");
xmlHttp.open("POST", param, true);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("Content-length", param.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
document.getElementsByName('text')[0].value = '';
document.getElementsByName('text')[0].focus();
delete xmlHttp;
}
}
xmlHttp.send(param);
}
window.onload = function(){setTimeout("document.getElementsByName('ntim')[0].value='-1';", 50);}
setTimeout('go()', 100);
</script>
<center>
<table border=0 cellspacing=0 cellpadding=5 width=330 style='border:1px solid black'>
<tr height=200><td colspan=3><div id=AA style='width:320;height:200'></div></td></tr>
<tr height=30><td colspan=3><input type=text name='xname' maxlength=10 style='width:65' value='<?=iconv('UTF-8', 'CP949//IGNORE', $_SESSION[name])?>'>
<input type='text' name='text' style='width:200;'>
<input type='submit' value='쓰기' onclick="wte()" class='button'>
<input type='hidden' name='ntim' value='-1'>
</td></tr>
</table>
</center>
<style>
body {font-size:9pt;font-family:gulim;word-break:break-all;}
td {word-break:break-all;font-size:9pt;}
.mm {color:#D7D7D7;font-weight:bold;font-family:gulim;text-align:center;padding-top:5}
.mc {color:#D7D7D7;font-family:gulim;text-align:center;padding-top:5}
.button {background-color:#D7D7D7;border:0;border:1px solid black;margin-right:4px;margin-left:4px;width:35px}
.name {width:50;padding-left:5;font-weight:bold;}
.memo {padding:5px 0px 5px 5px;width:210;}
.trh {padding:6px 0px 6px 0px;}
#AA {overflow-x: hidden; overflow-y: auto;background-color:#FFFFFF;border:1px solid black; }
</style>
</body>
</html> 보기 / 닫기
by Anna 안나 2008. 6. 8. 10:52