2009-05-28 25 views
5

Tôi đang cố gắng sử dụng javascript, không có khung (nguyên mẫu, jQuery, v.v.), để chèn dữ liệu được chuyển từ biểu mẫu html sang cơ sở dữ liệu mysql. Tôi đã quản lý để có được điều này làm việc nhưng, có được một vấn đề với một số ký tự đặc biệt thường được sử dụng trong ngôn ngữ của tôi (æøå). utf-8 hỗ trợ các ký tự này và mọi thứ hoạt động tốt khi tôi bỏ qua javascript. Tuy nhiên khi tôi cố gắng để vượt qua nội dung của các hình thức html thông qua chức năng bài javascript và thực hiện các truy vấn với kịch bản php làm việc của tôi, mỗi æøå được chuyển đổi thành æøà ¥.javascript có buộc bộ ký tự cụ thể không?

Để phân tích cú pháp, javascript có bằng cách nào đó buộc một bộ ký tự cụ thể khi không có mã nào khác được xác định trong mã không? Tôi đã cố gắng xác định charset trong tiêu đề của bài đăng javascript và tệp php cũng như biểu mẫu html.

Tôi tin rằng nó phải là một cái gì đó sai hoặc mất tích trong tập tin javascript của tôi, formpost.js:

function sendText(visbool){ 
    var http =new GetXmlHttpObject(); 
    var url = "sendtext.php"; 
    var ovrskrift = document.form1.overskrift.value; 
    var cont = document.form1.content.value; 

    var params = "overskrift=" + ovrskrift + "&tekst=" + cont + "&visbool=" + visbool; 
    http.open("POST", url, true); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.setRequestHeader("Content-length", params.length); 
    http.setRequestHeader("Connection", "close"); 

    http.onreadystatechange = function() {//Call a function when the state changes. 
    if(http.readyState == 4 && http.status == 200) { 
     // gjør noe smart her 
    } 
    } 
    http.send(params); 
} 


function GetXmlHttpObject() 
{ 
var objXMLHttp=null; 
if (window.XMLHttpRequest) 
    { 
    objXMLHttp=new XMLHttpRequest(); 
    } 
else if (window.ActiveXObject) 
    { 
    objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
return objXMLHttp; 
} 

sendtext.php:

<?php 
//variabler for spørring 
$date= date('Y-m-d'); 
$overskrift= $_POST["overskrift"]; 
$ostr='36'; 
$tekst= $_POST["content"]; 
//$tekst="test tekst"; 
$istr='32'; 
$bilde=""; 
$style="onlyinfo.css"; 
//$vis=$_POST['visbool']; 
$vis=0; 

require ('../config.php'); // henter informasjon om database tilkoblingen fra config.php 

if (!$con){die('Could not connect: ' . mysql_error());} // lager feilmelding hvis tilkoblingen mislyktes 

// spørring for databasen, konstrueres etter variablene som er angitt ovenfor 
$sql="INSERT INTO tbl_info(dato,overskrift_tekst,overskrift_str,infotekst_tekst,infotekst_str,bilde,style,vismeg) VALUES('" . $date . "','" . $overskrift . "','" . $ostr . "','" . $tekst . "','" . $istr . "','" . $bilde . "','" . $style . "','" . $vis . "')"; 
$result = mysql_query($sql); // kjører spørring og lagrer resultat i $result 

mysql_close($con); // lukker database tilkoblingen 
?> 

createslide.php: (dành .php mở rộng cho triển khai mã trong tương lai)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr"> 
<head> 
<title>inforMe: Legg til side</title> 
<link type="text/css" rel="stylesheet" href="./css/style.css" id="adminss"> 
<script src="./js/formpost.js"></script> 
<script type="text/javascript" src="./tinymce/jscripts/tiny_mce/tiny_mce.js"></script> 
<script type="text/javascript"> 
tinyMCE.init({ 
    mode : "textareas" 
}); 
</script> 

</head> 
<body> 
<div class="imgupload"> 
    <input type="button" value="Last opp bilde"> <img src="" /> 
</div> 
<div class="form"> 
    <form name="form1" method="post" action="sendtext.php"> 
    <label for="overskrift">Overskrift:</label> 
    <input type="text" size="70" id="overskift" name="overskrift"><br /> 
    <label for="content">Tekst:</label> 
    <textarea id="content" name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea> 
    <input type="button" value="save draft" onclick="sendText(0)"/> 
    <input type="button" value="save and publish" onclick="sendText(1)"/> 
    <input type="submit" value="regular submit button"/> 
    </form> 
</div> 

</body> 
</html> 

NB! Tôi không thực sự biết nơi để đặt thông tin này vì vậy .. tốt .. Tôi quyết định đi với nó ở đây: Trước hết cảm ơn cho tất cả các đề xuất tốt dưới đây. Tôi tin rằng câu hỏi đã được trả lời. Đối với vấn đề của tôi, nó chỉ được giải quyết một phần. Có vẻ như bộ ký tự utf-8 bị mất ở đâu đó dọc theo dòng ở đây, nếu tôi tạo cơ sở dữ liệu mysql mới với bộ ký tự Latin-1 và thay đổi tùy chọn bộ ký tự trong tệp của tôi thành iso-8859-1, nó hoạt động chính xác . Vì cài đặt thử nghiệm của tôi dựa trên tất cả phần mềm norwegian (trình duyệt, máy chủ db, v.v.), tôi cho rằng bất kỳ nơi nào không được chỉ định, nó sẽ trả lại iso-8859-1

NBB! Và bây giờ tất cả đều tốt. mọi thứ hoạt động tốt khi tôi thêm:

tiêu đề ('Content-Type: text/plain; charset = utf-8');

ở đầu tệp sendtext.php của tôi.

+0

Câu hỏi này đã được đăng một thời gian dài trước đây, nhưng tôi phải nói điều này: Vui lòng cho tôi biết đó không phải là mã xử lý SQL thực của bạn, vì nó khiến bạn mở rộng cho các cuộc tấn công SQL injection ... – Epcylon

Trả lời

7

Hãy thử phụ thêm các charset vào tiêu đề content-type như thế này:

"application/x-www-form-urlencoded; charset=utf-8;" 

Ngoài ra, trong tài liệu của bạn, bạn nên xác định nó là utf-8 trong tiêu đề:

<META http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Bạn nên có lẽ cũng làm encodeURI (giá trị) trên tất cả các giá trị của bạn để url được mã hóa đúng.

+1

này: "ứng dụng/x-www-form-urlencoded; bộ mã: utf-8;" phải như sau: "ứng dụng/x-www-form-urlencoded; charset = utf-8;" hoặc tôi đang làm sai. Tôi đã thử đặt này trong tập tin javascript của tôi. – mzaz

+0

Bạn đúng, đó là lỗi đánh máy. – PQW

+0

Điều đó phải là (chữ thường) "meta" (nếu bạn viết XHTML) hoặc không có "/" (nếu bạn đang viết HTML). Lưu ý rằng tiêu đề HTTP thực sẽ vượt quá mọi xác nhận quyền sở hữu từ meta. – Quentin

3

Nội bộ, JavaScript sử dụng Unicode, do đó, nó có thể lưu trữ các âm sắc của bạn mà không gặp sự cố. Lưu ý: Unicode! = UTF-8.

Nhưng sau đó, bạn cố gắng gửi văn bản đó đến máy chủ của mình và tại đây, sự cố bắt đầu. Dây (Internet) giữa trình duyệt và máy chủ của bạn không hỗ trợ Unicode, do đó trình duyệt phải mã hóa dữ liệu. Vì vậy, nó chuyển đổi Unicode thành một dòng byte UTF-8.

Ở phía máy chủ, bạn phải chuyển đổi dữ liệu trở lại thành Unicode.

1

Nó không bắt buộc, nhưng tùy thuộc vào bộ mã HTML đọc nó, cả bộ ký tự hiển thị được đặt trong siêu dữ liệu và cách định dạng tệp được lưu, nó sẽ hoàn toàn hài hước ...

Vì vậy, khi bạn lưu HTML và Javascript, hãy lưu cả dưới dạng UTF-8.

Hơn nữa, trong PHP, bạn có thể cần một số hành động mb_internal_encoding ...

0

Javascript không 'buộc' một trang mã như thế. Để có được kết quả bạn muốn, chỉ cần sử dụng escape() và unescape() để vượt qua ASCII mở rộng.

F.

+0

tức là cảnh báo (thoát ("æøå")); cảnh báo (unescape ("% E6% F8% E5")); – Fraser

1

Tôi nghĩ bạn có thể thử sử dụng encodeURIComponent.

var ovrskrift = encodeURIComponent(document.form1.overskrift.value); 

Bạn nên sử dụng mã này thay vì escape. Đọc thêm trên trang này: Comparing escape(), encodeURI(), and encodeURIComponent().

Nó nói:

[...] bạn nên tránh sử dụng các lối thoát() bất cứ khi nào có thể. Cách thay thế tốt nhất thường là encodeURIComponent(). [...]

... và điều đó có vẻ đúng trong trải nghiệm của tôi.

1

Hai chưa được kiểm tra (liên quan đến mẫu mã của bạn) gợi ý:

(1) Tham khảo JS bên ngoài của bạn với charset thuộc tính:

<script src="file.js" type="text/javascript" charset="utf-8"></script> 

(2) Có lẽ một cái gì đó hơn có thể được thực hiện trên PHP bên, giống như dải ký tự phi UTF8 ?:

<?php 
$result = iconv("UTF-8","UTF-8//IGNORE", $result); 
?> 
2

tôi nhận ra câu hỏi này đã được đăng đã hai năm trước đây, nhưng lý do câu trả lời PQW của hoạt động là client (trình duyệt) nên trả lời chúng tôi cùng một ký tự đặt trang được phân phát (do đó chỉ định UTF-8 trong thẻ META hoạt động). Sử dụng Javascript không thay đổi giả định cơ bản này (vì vậy câu trả lời sẽ đúng cho dù Javascript có liên quan hay không).

"Phương pháp đúng nhất" là chỉ định ký tự được đặt trong tiêu đề phản hồi của máy chủ, nhưng vì điều này không phải lúc nào cũng có thể (có thể bạn không có bất kỳ kiểm soát nào đối với chúng hoặc một số lý do khác), META -approach là cách tốt nhất tiếp theo để đạt được điều này.

+0

Một chú thích tốt cho câu trả lời của PQW. Bạn chạm vào một điểm quan trọng: bạn đang yêu cầu trang html và trang html đang kéo js vào. Vì vậy, thực sự, bạn nên tập trung vào mã hóa được sử dụng trong tệp 'parent' html, bằng cách gửi tiêu đề thích hợp (khi được phân phối bởi một tập lệnh, ví dụ) hoặc đặt thẻ META. – kasimir

Các vấn đề liên quan