2010-04-12 76 views
1

我有一个JavaScript文件,很多人都嵌入到他们的页面。由于我托管该文件,因此我可以控制该JavaScript文件;我无法控制它的嵌入方式,因为很多人已经在使用它。如何使用JavaScript中的相同编码发送参数?

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

之前发送的字符串我用encodeURIComponent()来编码。但是我发现每个客户都使用不同的编码发送相同的字符串,具体取决于他们的浏览器或他们正在访问的网站。结果,相同的字符串在到达servlet时用不同的字符表示(所以它们是不同的字符串)。

我所试图做的是字符串从JavaScript转换为一种编码的,所以当他们到达客户端同样的话用相同的字符表示。

这怎么可能?

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

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

编辑2:我不发送(并且不能发送)通过XMLHttpRequest的GET请求,因为域是不同的。我正在使用@streetpc提到的将script标记添加到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')); 
} 

回答

2

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

AddCharset utf-8 .js 

或者你可以使托管的JavaScript文件中创建另一个script标签与charset='utf-8'参数和添加它到head元素(最喜欢做的bookmarklet)。

我想的JavaScript解释为UTF-8编码,然后应该得到/处理UTF-8字符串。

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

request.setCharacterEncoding("UTF-8"); 

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

3

我想通了,是每一个客户端发送相同字符串不同编码

虽然这会为<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字符以解决此限制。)

+0

我正在使用非ASCII字符,这就是为什么我遇到问题。 – nimcap 2010-04-12 14:30:28

+0

您在返回的'.js'中使用文字,原始非ASCII字符?如果是这样,您将需要对它们进行编码,以便它们仅适用于ASCII。对于字符串文字来说,这很容易,如上所述。 (我想不出你需要字符串以外的非ASCII字符的原因。) – bobince 2010-04-12 14:32:02

+0

我更新了我的问题,使其更加清晰,我使用非ASCII字符但不直接在JS中。我从页面中获取它们,通常包含非ASCII字符。 – nimcap 2010-04-12 14:50:03

相关问题