【问题标题】:How to send parameters with same encoding from javascript?如何从javascript发送具有相同编码的参数?
【发布时间】:2010-04-12 14:09:44
【问题描述】:

我有一个 javascript 文件,很多人都将它嵌入到他们的页面中。由于我托管该文件,因此我可以控制该 javascript 文件;我无法控制它的嵌入方式,因为很多人已经在使用它了。

这个 javascript 文件向我的 servlet 发送 GET 请求,并且随请求传递的参数被记录到 DB。例如,javascript 向http://myserver.com/servlet?p1=123&p2=aString 发送请求,然后servlet 以某种方式将123aString 记录到DB。

在发送字符串之前,我使用encodeURIComponent() 对其进行编码。但我发现每个客户端都会根据浏览器或访问的站点发送具有不同编码的相同字符串。结果,相同的字符串在到达 servlet 时用不同的字符表示(因此它们是不同的字符串)。

我要做的是将字符串从 javascript 转换为一种编码,这样当它们到达客户端时,相同的单词会用相同的字符表示。

这怎么可能?

PS。如果有办法从 Java 转换编码,它也是适用的。

编辑:更准确地说,我从页面中选择了一些单词并将其发送到服务器。这就是编码导致问题的地方。

编辑 2: 我没有通过 XMLHttpRequest 发送(也无法发送)GET 请求,因为域不同。我正在使用将script 标签添加到@streetpc 提到的head 方法。

编辑 3: 目前我正在通过在 javascript 端替换非 ASCII 字符来清理字符串,但我觉得这不是要走的路:

function sanitize(word) {
    /*
    ğ : \u011f
    ü : \u00fc
    ş : \u015f
    ö : \u00f6
    ç : \u00e7
    ı : \u0131
    û : \u00fb
    */
    return encodeURIComponent(
            word.replace(/\u011f/g, '_g')
                .replace(/\u00fc/g, '_u')
                .replace(/\u00fb/g, '_u')
                .replace(/\u015f/g, '_s')
                .replace(/\u00f6/g, '_o')
                .replace(/\u00e7/g, '_c')
                .replace(/\u0131/g, '_i'));
}

【问题讨论】:

    标签: java javascript unicode encoding utf-8


    【解决方案1】:

    我发现每个客户端都发送具有不同编码的相同字符串

    虽然这对于<form> 提交是正常的,但对于 XMLHttpRequest 工作则不应该发生这种情况。 encodeURIComponent 函数总是明确地写入 URL 编码的 UTF-8 字节,而不管使用它的页面的编码。当然,说服您的 servlet 容器允许您读取那些 UTF-8 字节而不弄乱它们是另一回事,但这不应该取决于客户端。

    如果您在脚本文件本身中使用原始非 ASCII 字符,则可能会出现问题。在这种情况下,这些字符的解释将根据浏览器用于加载脚本的字符集而有所不同。这可能会受到以下因素的影响:

    1. Content-Type: text/javascript;charset= 标头中声明的任何字符集。
    2. <script src="..." charset="..."> 元素上声明的任何 charset 属性。
    3. 包含脚本的页面的字符集。

    (1) 和 (2) 并非在所有浏览器中都受支持。通常您可以依赖 (3),但作为第三方脚本作者,这是您无法控制的。因此,您应该在脚本中只使用 ASCII 字符。 (使用 \u1234 转义在脚本中的字符串文字中包含非 ASCII 字符以绕过此限制。)

    【讨论】:

    • 我使用的是非 ASCII 字符,这就是我遇到问题的原因。
    • 您在返回的.js 中使用文字、原始非ASCII 字符?如果是这样,您将需要对它们进行编码,以便它们仅适合 ASCII。对于很简单的字符串文字,如上所述。 (我想不出你需要字符串文字之外的非 ASCII 字符的原因。)
    • 我更新了我的问题更清楚,我使用的是非 ASCII 字符,但不是直接在 JS 中。我从页面中获取它们,它们通常包含非 ASCII 字符。
    • 当包含在 HTML 文档中时,字符已经是 Unicode。如果它们在用户的浏览器上正确显示,它们肯定也会正确地通过encodeURIComponent。如果这些字词没有正确显示在用户的浏览器中,那么您几乎无法恢复它们。
    • +1 不错的 Bob。 FWIW,encodeURIComponent 专门创建 UTF-8 字节序列的事实已在规范的第 15.1.9 节(第 3 版和第 5 版)中涵盖。 ecma-international.org/publications/standards/Ecma-262.htm
    【解决方案2】:

    您是否在 HTTP 标头中指定 JavaScript 文件的编码?就像Content-type: text/javascript; charset=utf-8 一样, .js 文件当然是以 UTF-8 保存的。使用 Apache,您可以配置

    AddCharset utf-8 .js 
    

    或者您可以让托管的 javascript 文件创建另一个带有 charset='utf-8' 参数的 script 标记,并将其添加到 head 元素(就像大多数书签一样)。

    我认为被解释为 UTF-8 代码的 javascript 然后应该获取/操作 UTF-8 字符串。

    然后,在您的 Java Servlet 中,您可以指定要使用的输入编码:

    request.setCharacterEncoding("UTF-8");
    

    编辑:查看此页面关于Character Encoding in JavaScript,尤其是名为“设置字符编码”的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2017-11-23
      • 2020-12-31
      • 2016-07-08
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多