วันศุกร์ที่ 18 กรกฎาคม พ.ศ. 2557

ajax utf-8 encoding, ajax utf-8 decoding , asp แปลง utf-8 ไป tis-620 หรือ windows-874 และ แปลง tis-620 ไป unicode char

วิธีการที่ผม เสนอไปนี้ ทำงานอยูสภาพแวดล้อม 
1.page ที่จะส่ง หรือทุกเพจ ใช้ charset tis-620 ดังนั้น มิจำเป็นต้อง ตั้ง charset เป้น utf-8
2.dbs ผมเป็น access

วิธีการข้างล่างจะช่วยแก้เรื่อง ajax รับค่าจาก tis-620 และ ส่งออกมาเป็น utf-8 ดังนั้นเมื่อทำการจัดเก็บในฐายข้อมูลจะพบว่าเป็น รหัส unicode ซึ่งอ่านไม่ออก และนำ้มาแสด่งผลใน page ที่กำหนด charset เป็น tis-620 หรือ windows-874 ซึ่งอ่านไม่ออก

วิธีแก้ไข
1.ก่อนส่งเข้า function ของ ajax  โดยเฉพาะทำงานร่วมกับภาษาไทย เช่น tis-620 ให้ เข้ารหัสก่อน  ด้วย javascript คือ
encodeURIComponent($("#remark").val())  ผลลัพธ์ก่อนเข้ารหัสจะเป็น อย่างเช่น คำว่า ทดสอบ1 จะได้ดังล่าง
%E0%B8%97%E0%B8%94%E0%B8%AA%E0%B8%AD%E0%B8%9A1
2.และเมื่อ ajax ประมวลผลเสร็จ จะได้ output เป็น utf-8 ดังนั้นเพื่อให้ผลลัพธ์ที่ถูกต้องคืออ่านไทยได้
ทั้งในหน้าเพจ tis-620 หรือใน ฐานข้อมูล  ต้องทำงการแปลงกลับก่อนโดย
ทำงานร่วมกับ function ข้างล่าง สร้าง function javascript ให้ใช้งานใน asp code
<%  FUNCTION URLDecode(str)
     Dim objScript,RepUrlDecode
    Set objScript = Server.CreateObject("ScriptControl")
    objScript.Language = "JavaScript"
     RepUrlDecode = objScript.Eval("decodeURIComponent(""" & str & """)")
     URLDecode = objScript.Eval("decodeURIComponent(""" & RepUrlDecode & """)")
    Set RepUrlDecode = NOTHING
    Set objScript = NOTHING

END FUNCTION
%>

จะสังเกตว่า ผมต้องทำ decodeURIComponent 2 รอบ ภายใน function เพราะ ajax จะให้ output ออกมาดังล่าง
'mystr=request.Form("realname")  สตริงออกมาจาก ajax utf-8 จะมี %25ติดมา เข้ารหัสในหน้า page tis-620
'sql=URLDecode(mystr) ถอดรหัส utf-8 เป็น  unicode char  จะตัด %25ออก จะมีค่าเท่ากับ  encodeURIComponent ที่ทำให้หน้า page tis-620
'sql1=URLDecode(sql)  ถอดรหัส unicode char เป็น tis-620 ใช้ decodeURIComponent ถอดมาเป็น tis-620 ในหน้า tis-620
ตามที่ผมได้อธิบายดังข้างบน ก็จะแก้ ปัญหาเรื่อง ajax ใน tis-620 ได้

3..ในหน้า ที่ ต้องทำการ ทำ sql query ก็จะทำการแปลงรหัสก่อนจะส่งใน sql string
sql="UPDATE userinfo SET "
sql=sql & "logname='" & URLDecode(request.Form("logname"))  & "', "
sql=sql & "remark='" & URLDecode(request.Form("remark"))  & "', "
'sql=sql & "level=" & URLDecode(request.Form("level"))  & ", "
sql=sql & "realname='" & URLDecode(request.Form("realname"))  & "', "
sql=sql & "realsurname='" & URLDecode(request.Form("realsurname"))  & "', "
sql=sql & "realposition='" & URLDecode(request.Form("realposition"))  & "' "

sql=sql & "WHERE ID=" & request.Form("id") & ";"
4.เราก็จะได้ output ที่ถูกต้อง  แสดงผลภาษาไทยได้



---------------------------------------------------------------------------------------
โค้ดชื่อ  tableloginshow.asp
<!Doctype html>
<html>
<head>
<meta charset="tis-620" />
</head>
<!-- #include virtual="/v1/salary/dbconnect.asp"-->
<%
response.Expires=-1
response.CharSet="tis-620"
id=Request.querystring("id")
'response.Write(" :" & id)
'response.End
if id="" then response.end
set rs = Server.CreateObject("ADODB.Recordset")
rs.open "SELECT * FROM userinfo where ID=" & id & ";",conn
%>
<script>
    $(document).ready(function () {

        $("#userinfoUpdate").click(function () {
            var myprompt = confirm("ต้องการบันทึก");
            if (myprompt) {
                var maxlevel = Number($("#level").attr("max"));
                var myvalue = $("#level").attr("value").valueOf();
                //alert(typeof (maxlevel) + ":" + typeof (myvalue));
                if (myvalue > maxlevel) {
                    alert("ต้องการตัวเลข level ช่วง 1-" + maxlevel.toString() + "\nกรุณาใส่ใหม่!");
                } else {
                    // alert($("#ID").val());
                    $.post("userinfoUpdate.asp", {
                        id: $("#ID").val(),
                        logname: encodeURIComponent($("#logname").val()),
                        //pw: $("#pw").val(),
                        remark: encodeURIComponent($("#remark").val()),
                        level: encodeURIComponent($("#level").val()),
                        //  pk_passkey: $("#pk_passkey").val(),
                        realname: encodeURIComponent($("#realname").val()),
                        realsurname: encodeURIComponent($("#realsurname").val()),
                        realposition: encodeURIComponent($("#realposition").val()),
                    }, function (data, status) {
                        alert("Data: " + data + "\nStatus: " + status);
                        $("#changepwd").click();
                    });
                }
            }
        });

        $("#utf8").click(function () {

            var xxx = $("#realname").val();
            var ixxx = decodeURI(xxx);
            alert(ixxx);
        });

        $("#userinfodelete").click(function () {
            var myprompt = confirm("ต้องการลบ?");
            if (myprompt) {
                var myid = $("#ID").val();
                // alert(myid);
                $.get("userinfoDelete.asp", { id: myid }, function (data, status) {
                    alert("Data: " + data + "\nStatus: " + status);
                    $("#changepwd").click();
                });
            }

        });

        //logname,pw,remark,level,pk_passkey,realname,realsurname,realposition"
        $("#userinfonew").click(function () {
            if ($(this).text() == "สร้างใหม่") {
                $("#userinfodelete").attr("disabled", true);
                $("#userinfoUpdate").attr("disabled", true);
                $(this).text("บันทึก");
                $("#tableuserinfo input").val("");
                $("#tableuserinfo .pwd").attr("disabled", false);

            } else {
                var myprompt = confirm("ต้องการสร้างใหม่?");
                if (myprompt) {
                    alert("new rec");
                    $.ajax({
                        url: 'userinfoAdd.asp',
                        data: {
                            logname: $("#logname").val(),
                            pw: $("#pw").val(),
                            remark: $("#remark").val(),
                            level: parseInt($("#level").val()),
                            pk_passkey: $("#pk_passkey").val(),
                            realname: $("#realname").val(),
                            realsurname: $("#realsurname").val(),
                            realposition: $("#realposition").val()
                        },
                        success: function (data, status, xhr) {
                            alert("Data success: " + data + "\nStatus: " + status);
                        },
                        error: function (data, status, xhr) {
                            alert("Data error: " + data + "\nStatus: " + status);
                        },
                        type: 'post'
                    });
                }
            }
        });

        $("#myclose").click(function () {
            // alert("test");
            // $("#showEditUser").html("<table style='border:1px solid black;'><tr><td>test</td><td>test</td></tr></table>");
            $("#showEditUser1").hide();
            // $("#showEditUser").load('tableLoginShow.asp?id=' + $(this).val());
        });

    });
</script>

<body>

<%response.write("***ช่อง id password passkey แก้ไขหรือเปลี่ยนแปลงไม่ได้ ถ้าต้องการแก้ไขให้ลบและสร้างใหม่")%><br />

<button name="save" value="save" id="userinfoUpdate">แก้ไข(รอทดสอบ)</button>
<button name="delete" value="delete" id="userinfodelete">ลบ</button>
<button name="new" value="new" id="userinfonew">สร้างใหม่(รอทดสอบ)</button>
<button name="close" value="close" id="myclose">ปิด</button>
<button name="utf8" value="utf8" id="utf8">urlencode from ajax check</button>

<br />

<table id="tableuserinfo" style="background-color:#b0c4de;border:1px solid black;">
<%
for each x in rs.Fields
         if lcase(x.name) ="id" then%>
           <tr>
           <td><%=x.name%> </td>
           <td><input type="text" disabled="disabled" name="<%=x.name%>" value="<%=x.value%>" ID="<%=x.name%>"</td>
         <%elseif x.name="pk_passkey" or x.name="pw" or lcase(x.name) ="id" then%>
           <tr>
           <td><%=x.name%> </td>
           <td><input class="pwd" disabled="disabled"   type="password" name="<%=x.name%>" value="<%=x.value%>" size="20" ID="<%=x.name%>" ></td>      
        <%elseif x.name="logname"  then%>
           <tr>
           <td><%=x.name%> </td>
           <td><input type="text" name="<%=x.name%>" value="<%=x.value%>" size="20" ID="<%=x.name%>" ></td>
        <%elseif x.name="level" then%>
           <tr>
           <td><%=x.name%> </td>
           <td><input id="<%=x.name%>" type="number" min="1" max=<%=session("level")%>  name="<%=x.name%>" value="<%=x.value%>" />*ต้องการค่าระหว่าง 1-<%=session("level")%></td>
           <td>(level 3=all ,invisible salary for each employee)(level 7=all,can edit salary rec. in ss mode)</td>
        <%else%>
           <tr>
           <td><%=x.name%> </td>
           <td><input  type="text"  name="<%=x.name%>" value="<%=x.value%>" size="20" ID="<%=x.name%>" /> </td>        
        <% end if
 
next
rs.close
conn.close
%>
</tr>
</table>
<br />

</body>
</html>

โค้ดล่าง userinfoupdate.asp
<!-- #include virtual="/v1/salary/dbconnect_grandattendancetosalary.asp"-->
<%
dim sql
response.Expires=-1
response.CharSet="tis-620"
 if Session("login")="" then
    response.Write("<script>alert('หมดเวลา session')</script>")
    response.Redirect(server.MapPath("/v1/index.asp"))
    response.End
 end if
 FUNCTION URLDecode(str)
     Dim objScript,RepUrlDecode
    Set objScript = Server.CreateObject("ScriptControl")
    objScript.Language = "JavaScript"
     RepUrlDecode = objScript.Eval("decodeURIComponent(""" & str & """)")
     URLDecode = objScript.Eval("decodeURIComponent(""" & RepUrlDecode & """)")
    Set RepUrlDecode = NOTHING
    Set objScript = NOTHING

END FUNCTION

'mystr=request.Form("realname")  สตริงออกมาจาก ajax utf-8 จะมี %25ติดมา เข้ารหัสในหน้า page tis-620
'sql=URLDecode(mystr) ถอดรหัส utf-8 เป็น  unicode char  จะตัด %25ออก จะมีค่าเท่ากับ  encodeURIComponent ที่ทำให้หน้า page tis-620
'sql1=URLDecode(sql)  ถอดรหัส unicode char เป็น tis-620 ใช้ decodeURIComponent ถอดมาเป็น tis-620 ในหน้า tis-620

sql="UPDATE userinfo SET "
sql=sql & "logname='" & URLDecode(request.Form("logname"))  & "', "
sql=sql & "remark='" & URLDecode(request.Form("remark"))  & "', "
'sql=sql & "level=" & URLDecode(request.Form("level"))  & ", "
sql=sql & "realname='" & URLDecode(request.Form("realname"))  & "', "
sql=sql & "realsurname='" & URLDecode(request.Form("realsurname"))  & "', "
sql=sql & "realposition='" & URLDecode(request.Form("realposition"))  & "' "

sql=sql & "WHERE ID=" & request.Form("id") & ";"

'response.Write(mystr & " " & sql & " " & sql1)
'response.End
conn2.Execute sql,recaffected
if err<>0 then
  'Response.Write("No update permissions!")
else
  'Response.Write("<h3>" & recaffected & " record added</h3>")
end if
conn2.close
on error goto 0
%>




ไม่มีความคิดเห็น:

แสดงความคิดเห็น