javascript强制特定的字符集吗?

时间:2009-05-28 09:15:46

标签: javascript html forms post character-encoding

我正在尝试使用javascript,没有框架(原型,jQuery等),将从html表单传递的数据插入到mysql数据库中。我设法让这个工作,但是,我的语言中常用的一些特殊字符(æøå)出现问题。 utf-8支持这些字符,当我跳过javascript时一切正常。但是,当我尝试通过javascript post函数传递html表单的内容并使用我的工作php脚本执行查询时,每个æøå都会转换为Ã|åå。

要将其分解,当代码中没有确定其他内容时,javascript会以某种方式强制使用特定的字符集吗?我试图在javascript帖子和php文件的标题以及html表单中指定charset。

我认为我的javascript文件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 :(为将来的代码实现保留.php扩展名)

<!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! 我真的不知道在哪里提供这些信息......好吧..我决定在这里使用它: 首先感谢下面的所有好建议。我相信这个问题得到了解答。至于我的问题,它只是部分解决了。

似乎utf-8字符集在这里的某处丢失了,如果我使用Latin-1字符集创建一个新的mysql数据库并将我的文件中的charset选项更改为iso-8859-1它完全正确。由于我的测试设置基于所有挪威软件(浏览器,数据库服务器等),我想如果没有另外指定它将返回iso-8859-1

NBB! 现在再次好起来。当我添加时,一切正常:

header('Content-Type:text / plain; charset = utf-8');

到我的sendtext.php文件的顶部。

7 个答案:

答案 0 :(得分:8)

尝试将charset附加到内容类型标头,如下所示:

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

此外,在您的文档中,您应该在标题中指定它是utf-8:

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

您可能还应对所有值进行encodeURI(值),以便正确地进行网址编码。

答案 1 :(得分:3)

在内部,JavaScript使用Unicode,因此它可以毫无问题地存储您的变音符号。注意:Unicode!= UTF-8。

但是,然后,您尝试将该文本发送到您的服务器,在这里,麻烦就开始了。浏览器和服务器之间的连线(Internet)不支持Unicode,因此浏览器必须对数据进行编码。因此它将Unicode转换为UTF-8字节流。

在服务器端,您必须将数据转换回Unicode。

答案 2 :(得分:2)

我意识到这个问题已经在两年前发布了,但PQW的回答起作用的原因是客户端(浏览器)应该使用与服务页面相同的字符集进行回复(因此在META标记中指定UTF-8)作品)。使用Javascript不会改变这个基本假设(因此无论是否涉及Javascript,答案都是正确的。)

“最正确的方法”是在服务器响应头中指定字符集,但由于这并不总是可行(可能您没有对它们的任何控制或许多其他原因),因此META-方法是实现这一目标的下一个最佳方式。

答案 3 :(得分:1)

它不强制一个,但是根据HTML读取它的字符集,元数据中设置的显示字符集和文件格式的保存方式,它都会很有趣......

因此,当您保存HTML和Javascript时,请同时保存为UTF-8。

此外,在PHP中,您可能需要一些mb_internal_encoding操作...

答案 4 :(得分:1)

我认为您可以尝试使用encodeURIComponent

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

您应该使用此代替escape。在此页面上阅读更多内容:Comparing escape(), encodeURI(), and encodeURIComponent()

它声明:

  

[...]你应该尽可能避免使用escape()。   最好的选择通常是encodeURIComponent()。   [...]

......在我的经历中,这似乎也是正确的。

答案 5 :(得分:1)

两个未经测试的(与您的代码示例相关)建议:

(1)使用charset属性引用外部JS:

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

(2)也许在PHP方面可以做更多的事情,比如剥离非UTF8字符?:

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

答案 6 :(得分:0)

Javascript不强制“强制”这样的代码页。 要获得结果,只需使用escape()和unescape()来传递扩展的ASCII。

F。