Как перекодировать строку Javascript в ISO-8859-1?

Я пишу расширение Chrome, которое работает с веб-сайтом, использующим ISO-8859-1. Просто чтобы дать некоторый контекст, мое расширение делает публикацию на форумах сайта быстрее, добавляя более удобную форму сообщения. Значение textarea, в котором записано сообщение, затем отправляется через вызов Ajax (используя jQuery).

если сообщение содержит символы, такие как á эти символы отображаются как á в опубликованном сообщении. Заставить браузер отображать UTF-8 вместо ISO-8859-1 делает á отображается правильно.

насколько я понимаю, Javascript использует UTF-8 для своих строк, поэтому моя теория заключается в том, что если я перекодирую строку в ISO-8859-1 перед ее отправкой, она должна решить мою проблему. Однако, похоже, нет прямого способа сделать это перекодирование в Javascript, и я не могу коснуться кода на стороне сервера. Есть советы?

Я попытался установить созданную форму для использования iso-8859-1 следующим образом:

var form = document.createElement("form");
form.enctype = "application/x-www-form-urlencoded; charset=ISO-8859-1";

и также:

var form = document.createElement("form");
form.encoding = "ISO-8859-1";

но это, кажется, не работает.

EDIT:

проблема на самом деле лежала в том, как jQuery urlencoding сообщение (или что-то по пути), я исправил это, сказав jQuery не обрабатывать данные и делать это сам, как показано в следующем фрагменте:

function cfaqs_post_message(msg) {
  var url = cfaqs_build_post_url();
  msg = escape(msg).replace(/+/g, "%2B");
  $.ajax({
    type: "POST",
    url: url,
    processData: false,
    data: "message=" + msg + "&post=Preview Message",
    success: function(html) {
      // ...
    },
    dataType: "html",
    contentType: "application/x-www-form-urlencoded"
  });
}

2 ответов


насколько я понимаю, Javascript использует UTF-8 для своих строк

нет, нет.

каждая страница имеет свою кодировку, определенную в метатеге,чуть ниже главный элемент

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

или

<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>

кроме того, каждая страница должен быть отредактирован с целевой кодировкой кодировки. В противном случае он не будет работать как ожидалось.

и это хорошая идея, чтобы определить свою цель кодировки на стороне сервера.

Java
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

PHP
header("Content-Type: text/html; charset=UTF-8");

C#
I do not know how to...

и было бы неплохо настроить каждый файл сценария, использует ли он чувствительные символы (á, é, í, ó, ú и так далее...).

<script type="text/javascript" charset="UTF-8" src="/PATH/TO/FILE.js"></script>

...

поэтому моя теория заключается в том, что если я перекодирую строку в ISO-8859-1 перед ее отправкой, она должна решить мою проблему

нет, нет.

целевой сервер может обрабатывать строки, отличные от ISO-8859-1. Для например, Tomcat обрабатывает ISO-8859-1, независимо от того, как вы настраиваете свою страницу. Таким образом, на стороне сервера вам может потребоваться настроить свой запрос в соответствии с тем, как вы настроили свою страницу.

Java
request.setCharacterEncoding("UTF-8")

PHP
// I do not know how to...

если вы действительно хотите перевести целевую кодировку кодировки, попробуйте сделать следующее

InternetExplorer
    formElement.encoding = "application/x-www-form-urlencoded; charset=ISO-8859-1";
ELSE
    formElement.enctype  = "application/x-www-form-urlencoded; charset=ISO-8859-1";

или вы должны предоставить функцию, которая получает числовое представление в наборе символов Unicode, используемом каждым символом. Он будет работать вне зависимости от конкретной кодировки. Например, á как набор символов Юникода - \u00E1;

alert("á without its Unicode Character Set numerical representation");
function convertToUnicodeCharacterSet(value) {
    if(value == "á")
        return "\u00E1";
}
alert("á Numerical representation in Unicode Character Set is: " + convertToUnicodeCharacterSet("á"));

здесь вы можете видеть в действии:

вы можете использовать этот ссылке как руководство (см. JavaScript escapes)

добавлен к исходному ответу, как я реализую функциональность jQuery

var dataArray = $(formElement).serializeArray();
var queryString = "";
for(var i = 0; i < dataArray.length; i++) {
    queryString += "&" + dataArray[i]["name"] + "+" + encodeURIComponent(dataArray[i]["value"]);
}
$.ajax({
    url:"url.htm",
    data:dataString,
    contentType:"application/x-www-form-urlencoded; charset=UTF-8",
    success:function(response) {
        // proccess response
    });
});

он отлично работает без головной боли.

С уважением,


у меня была очень похожая проблема. Мне нужно было передать параметр URL с помощью JQuery для вызова ajax, и в большинстве случаев значения параметров включали акценты.

обе страницы должны были быть установлены в charset=ISO-8859-1 и функции javascript: encodeURI, encodeURIComponent и т. д. использует только UTF-8.

то, что я сделал, это создать ссылку на исходной странице, включая все параметры без какой-либо кодировки, скажем:

var myLink = document.getElementById("myHiddenLink");
myLink.setAttribute("href", "México, Perú, María and any other words with accents and spaces");

и затем присвоить значение href для переменной, например:

var theLink = myLink.getAttribute("href");

Итак, наконец, значение переменной "theLink" было закодировано ISO-8859-1, и все работало нормально.