18

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

Если сообщение содержит такие символы, как á, эти символы отображаются в сообщении á в опубликованном сообщении. Принудительное отображение браузера 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" 
    }); 
} 
+0

Как вы отправляете сообщение (например, полный пример отказа от кода AJAX)? –

ответ

23

это мое понимание того, что Javascript использует UTF-8 для строк

Нет, нет.

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

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

И это может быть хорошей идеей, чтобы настроить каждый файл сценария использует ли чувствительные символы (A, E, I, O, U и так далее ...).

<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("á")); 

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

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

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

С уважением,

+0

Спасибо за информативный ответ, я считаю его правильным, даже если это не совсем решение. Мой пост не дал достаточно информации, чтобы показать реальную проблему. (Я узнал об этом только после того, как ударил головой о стену еще несколько часов) –

+0

@ Маркос Марин Добавил исходный ответ –

+0

Для C#: <% @ Page RequestEncoding = "utf-8" ResponseEncoding = "utf -8 "%> –

4

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