Как я транскодирую строку JavaScript к ISO-8859-1?

Я пишу расширение Chrome, которое работает с веб-сайтом, который использует ISO-8859-1. Только для предоставления некоторого контекста, что делает мое расширение, делает регистрацию на форумах сайта более быстрой путем добавления более удобной формы сообщения. Значение текстовой области, где сообщение записано, затем отправляется через вызов 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";

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

Править:

Проблема на самом деле лгала в том, как 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"
  });
}
18
задан dda 17 November 2012 в 15:10
поделиться

1 ответ

Насколько я понимаю, 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, используемое каждым символом.Он будет работать независимо от целевой кодировки. Например, á как набор символов 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("á"));

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

Вы можете использовать эту ссылку в качестве руководства (см. Escape-последовательности JavaScript)

к оригинальному ответу, как я реализую функциональность 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
    });
});

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

С уважением,

24
ответ дан 30 November 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: