Javascript заставляет определенную кодировку? - PullRequest
6 голосов
/ 28 мая 2009

Я пытаюсь использовать javascript без фреймворка (prototype, jQuery и т. Д.), Чтобы вставить данные, переданные из html-формы, в базу данных mysql. Мне удалось заставить это работать, но у меня возникли проблемы с некоторыми специальными символами, обычно используемыми в моем языке ()øå). utf-8 поддерживает эти символы, и все отлично работает, когда я пропускаю javascript. Однако, когда я пытаюсь передать содержимое html-формы с помощью функции javascript post и выполнить запрос с моим рабочим php-скриптом, каждое значение преобразуется в ææà ¥.

Чтобы разобраться, javascript каким-то образом форсирует конкретную кодировку, если в коде не определено ничего другого? Я попытался указать кодировку в заголовке поста javascript и файла php, а также в форме html.

Я считаю, что это должно быть что-то не так или отсутствует в моем файле 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
?>

createlide.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 теряется где-то здесь, если я создаю новую базу данных mysql с набором символов Latin-1 и изменяю параметры кодировки в моих файлах на iso-8859-1, она работает точно правильно. Так как мои настройки теста основаны на всем норвежском программном обеспечении (браузеры, сервер БД и т. Д.), Я предполагаю, что там, где не указано иное, возвращается iso-8859-1

НББ! И теперь все снова хорошо. все отлично работает когда добавляю:

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

в начало моего файла sendtext.php.

Ответы [ 7 ]

8 голосов
/ 28 мая 2009

Попробуйте добавить кодировку к заголовку типа контента следующим образом:

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

Кроме того, в вашем документе вы должны указать это utf-8 в заголовке:

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

Вероятно, вам следует также использовать encodeURI (значение) для всех ваших значений, чтобы он был правильно закодирован.

3 голосов
/ 28 мая 2009

Внутренне, JavaScript использует Unicode, поэтому он может хранить ваши умлауты без проблем. Примечание: Unicode! = UTF-8.

Но затем вы пытаетесь отправить этот текст на ваш сервер, и тут начинается проблема. Провод (Интернет) между браузером и вашим сервером не поддерживает Unicode, поэтому браузер должен кодировать данные. Таким образом, он преобразует Unicode в поток байтов UTF-8.

На стороне сервера вы должны преобразовать данные обратно в Unicode.

2 голосов
/ 14 октября 2011

Я понимаю, что этот вопрос был опубликован уже два года назад, но причина ответа PQW состоит в том, что клиент (браузер) должен отвечать, используя тот же набор символов, с которым была обслужена страница (таким образом, указывая UTF-8 в META-теге работает). Использование Javascript не меняет этого базового предположения (поэтому ответ будет правильным, независимо от того, был ли задействован Javascript или нет).

«Самый правильный метод» - указать набор символов в заголовке ответа сервера, но поскольку это не всегда возможно (возможно, вы не имеете никакого контроля над ними или по ряду других причин), META- следующий подход - лучший способ добиться этого.

1 голос
/ 28 мая 2009

Два непроверенных (в отношении вашего примера кода) предложения:

(1) Ссылка на ваш внешний JS с атрибутом charset:

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

(2) Может быть, что-то еще можно сделать на стороне PHP, например, раздеть символы без UTF8?:

<?php
$result = iconv("UTF-8","UTF-8//IGNORE", $result);
?>
1 голос
/ 28 мая 2009

Я думаю, вы можете попробовать использовать encodeURIComponent.

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

Вы должны использовать это вместо escape. Подробнее на этой странице: Сравнение escape (), encodeURI () и encodeURIComponent () .

В нем говорится:

[...] вам следует по возможности избегать использования escape (). Лучшей альтернативой обычно является encodeURIComponent (). [...]

... и это, похоже, верно и в моем опыте.

1 голос
/ 28 мая 2009

Это не принудительно, но в зависимости от того, какую кодировку HTML он читает, и набор символов отображения, заданный в метаданных, и способ сохранения формата файла, все будет смешно ...

Итак, когда вы сохраняете HTML и Javascript, сохраняете оба как UTF-8.

Кроме того, в PHP вам может понадобиться действие mb_internal_encoding ...

0 голосов
/ 28 мая 2009

Javascript не «форсирует» такую ​​кодовую страницу. Чтобы получить желаемый результат, просто используйте escape () и unescape (), чтобы передать расширенный ASCII.

F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...