如何将Javascript字符串转码为ISO-8859-1?

时间:2010-02-17 19:37:41

标签: javascript utf-8 google-chrome-extension iso-8859-1 transcoding

我正在撰写适用于使用ISO-8859-1的网站的Chrome扩展程序。只是为了给出一些背景信息,我的扩展功能是通过添加更方便的帖子表单来更快地在网站的论坛中发帖。然后,通过Ajax调用(使用jQuery)发送写入消息的textarea的值。

如果邮件中包含á等字符,则这些字符在发布的邮件中显示为Ã。强制浏览器显示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"
  });
}

2 个答案:

答案 0 :(得分:24)

  

据我了解,Javascript使用UTF-8作为其字符串

不,不。

每个页面都在元标记中定义了charset 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...

最好设置每个脚本文件是否使用敏感字符(á,é,í,ó,ú等等)。

<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字符集中的数字表示。无论目标字符集编码如何,它都将起作用。例如,á作为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("á"));
你可以看到

Here

您可以使用此link作为指导(请参阅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
    });
});

没有任何头痛就可以正常工作。

此致

答案 1 :(得分:4)

我有一个非常类似的问题。我需要使用JQuery传递一个URL参数来进行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编码的,一切正常。

相关问题