Подтвердить что ты не робот

Как перекодировать строку 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"
  });
}
4b9b3361

Ответ 1

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

Нет, нет.

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

<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, использует ли он чувствительные символы (á, é, í, ó, ú и т.д.).

<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...

Если вы действительно хотите перевести кодировку целевого кодирования, TRY следующим образом

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 Character Set, используемое каждым символом. Он будет работать независимо от кодировки целевой кодировки. Например, как набор символов Юникода -\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-экраны)

Добавлен исходный ответ, как я реализую jQuery funcionality

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
    });
});

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

Привет,

Ответ 2

У меня была очень похожая проблема. Мне нужно было передать параметр 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, и все работало нормально.