Как мне перекодировать строку Javascript в ISO-8859-1? - PullRequest
18 голосов
/ 17 февраля 2010

Я пишу расширение 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 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 ]

24 голосов
/ 20 февраля 2010

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

Нет, нет.

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

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

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

С уважением,

4 голосов
/ 22 октября 2013

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

...