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

Но это не похоже на работу.

EDIT:

Проблема на самом деле заключалась в том, как jQuery кодировал сообщение (или что-то по ходу дела), я исправил это, сказав 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 голосов | спросил Marcos Marin 17 FebruaryEurope/MoscowbWed, 17 Feb 2010 22:37:41 +0300000000pmWed, 17 Feb 2010 22:37:41 +030010 2010, 22:37:41

2 ответа


0
  

Насколько я понимаю, 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 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("á"));

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

Вы можете использовать эту ссылку в качестве руководства (см. раздел «Побег из 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
    });
});

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

Привет,

ответил Arthur Ronald 20 FebruaryEurope/MoscowbSat, 20 Feb 2010 21:08:38 +0300000000pmSat, 20 Feb 2010 21:08:38 +030010 2010, 21:08:38
0

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

ответил Sergio 22 +04002013-10-22T12:03:09+04:00312013bEurope/MoscowTue, 22 Oct 2013 12:03:09 +0400 2013, 12:03:09

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132