Как перекодировать строку 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"
});
}
2 ответов
насколько я понимаю, 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, используемом каждым символом. Он будет работать вне зависимости от конкретной кодировки. Например, á как набор символов Юникода - \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 escapes)
добавлен к исходному ответу, как я реализую функциональность 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
});
});
он отлично работает без головной боли.
С уважением,
у меня была очень похожая проблема. Мне нужно было передать параметр 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, и все работало нормально.