代码之家  ›  专栏  ›  技术社区  ›  Marcos Marin

如何将javascript字符串转换为ISO-8859-1?

  •  18
  • Marcos Marin  · 技术社区  · 14 年前

    我正在写一个Chrome扩展,它与一个使用ISO-8859-1的网站协同工作。为了提供一些上下文,我的扩展所做的是通过添加一个更方便的帖子表单,更快地在网站的论坛中发布内容。然后通过Ajax调用(使用jquery)发送消息写入的文本区域的值。

    如果邮件包含以下字符: á 这些字符在已发布的消息中显示为_。强制浏览器显示UTF-8而不是ISO-8859-1,使 正确出现。

    据我所知,javascript的字符串使用utf-8,所以我的理论是,如果在发送之前将字符串转换为i so-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是如何对消息进行编码的(或者一路上发生的事情),我通过告诉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 回复  |  直到 7 年前
        1
  •  24
  •   Chrillewoodz    7 年前

    据我所知,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字符集中的数字表示。不管目标字符集编码如何,它都能工作。例如,_as 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
        });
    });
    

    它工作得很好,没有任何头痛。

    当做,

        2
  •  4
  •   Sergio    11 年前

    我也遇到了类似的问题。我需要使用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编码的,一切都正常工作。