我正在编写一个 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";

但这似乎不起作用。

编辑:

问题实际上在于 jQuery 如何对消息(或沿途的某些内容)进行 urlencode,我通过告诉 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"
  });
}
有帮助吗?

解决方案

  

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

如果你真的要翻译的目标字符集编码,尽量如下:

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字符集,每个字符使用。不管目标charset编码的它将工作。例如,为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的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
    });
});

它正常工作而没有任何头痛。

此致

其他提示

我有一个非常相似的问题。我需要使用 JQuery 传递 URL 参数来进行 ajax 调用,并且大多数时候参数值包含重音符号。

两个页面都必须设置为 charset=ISO-8859-1 和 javascript 的函数:编码URI、编码URI组件等仅使用 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 编码的,一切都工作得很好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top