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

Mar*_*rin 18 javascript utf-8 iso-8859-1 transcoding google-chrome-extension

我正在编写一个与使用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";
Run Code Online (Sandbox Code Playgroud)

并且:

var form = document.createElement("form");
form.encoding = "ISO-8859-1";
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

编辑:

问题实际上是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"
  });
}
Run Code Online (Sandbox Code Playgroud)

Art*_*ald 24

据我所知,Javascript使用UTF-8作为字符串

不,不.

每个页面都在元标记中定义了charset enconding,就在 head元素下面

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
Run Code Online (Sandbox Code Playgroud)

要么

<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>
Run Code Online (Sandbox Code Playgroud)

除此之外,应使用目标charset编码编辑每个页面.否则,它将无法按预期工作.

在服务器端定义目标字符集编码是个好主意.

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...
Run Code Online (Sandbox Code Playgroud)

设置每个脚本文件是否使用敏感字符(á,é,í,ó,ú等等)可能是一个好主意.

<script type="text/javascript" charset="UTF-8" src="/PATH/TO/FILE.js"></script>
Run Code Online (Sandbox Code Playgroud)

...

所以我的理论是,如果我在发送之前将字符串转码为ISO-8859-1,它应该可以解决我的问题

不,不.

目标服务器可以处理ISO-8859-1以外的字符串.例如,无论您如何设置页面,Tomcat都会在ISO-8859-1中处理.因此,在服务器端,您可能必须根据设置页面的方式设置请求.

Java
request.setCharacterEncoding("UTF-8")

PHP
// I do not know how to...
Run Code Online (Sandbox Code Playgroud)

如果您真的想要翻译目标字符集编码,请按如下方式进行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";
Run Code Online (Sandbox Code Playgroud)

或者您应该提供一个函数来获取每个字符使用的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("á"));
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到实际行动:

您可以使用此链接作为指导(请参阅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
    });
});
Run Code Online (Sandbox Code Playgroud)

它没有任何头痛,工作正常.

问候,