当从客户端发送请求到java servlet时,字符串编码特殊字符的问题

时间:2015-02-05 12:55:46

标签: java json servlets encoding utf-8

简短版:

我正在尝试发送JSON字符串,并确保它可以处理特殊字符。就我而言,关键字母是ÆØÅæøåå,它出现在丹麦语和挪威语标准字母表中。

我正在从jsp页面发送JSON - >通过JQuery / ajax $ .getJSON - >到java servlet(并最终将其保存到数据库)

在发送$ .getJSON之前,我已经确认json数据字符串是{"value": "Æ Ø Å æ ø å"}。但是,当我通过java的HttpRequest.getParameter("jsonData")检索字符串时,它会给我{"value": "� � � � � �"}

$.ajaxSetup({ scriptCharset: "utf-16" , contentType: "application/json; charset=utf-16"});之前添加行$.getJSON,使其在Google Chrome中有效,但在IE10中无效...

如何让客户端和服务器端相互理解?



其他信息(长版问题)

环境: 我在Weblogic 11g服务器上运行java Web应用程序。我的java版本是1.6(受weblogic和公司标准的限制)。

以前的尝试和研究:

我知道这是一个编码问题。我知道java字符串是用UTF-16编码的。我也知道我的jsp页面设置了UTF-8编码:<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />

我认为必须可以告诉java servlet传入的字节是否处于某种编码状态?但是关于这个主题的很多资源只是要求我简化我的所有模块(服务器,数据库和客户端)以使用相同的编码。这可能会有效,但它需要大量工作,我甚至不确定我是否拥有决定所有模块编码所需的权限。对我而言,它也与以下Q&amp; A:

一样有意义

问:我们怎样才能让中国人,西班牙人和俄罗斯人相互理解?
答:让他们将母语改为共同语言

不,这里必须有一种方法可以将翻译器添加到混音中,对吗?

设置文件和编码属性 我已经过了一些问题和答案,他们似乎声称我需要更改托管我的网络应用程序的服务器中的一些设置。我可以为我的测试服务器做到这一点,但我不能用于实际的托管服务器,因为它不是我个人可以玩的。除非我可以为此特定Web应用程序而不是整个服务器进行特定设置。

但是,我只介绍了如何为apache tomcat服务器执行此操作...

上一个结果:

当我第一次尝试解决这个问题时,只有大写字母才是问题。服务器端收到的字符串为{"value": "� � � æ ø å"} 我尝试了很多不同的方法,我不记得是什么让小写字母也被误解了,但它并没有太大的区别。无论如何,毫无疑问,我需要确切地知道如何控制它。

资源: 我最喜欢的关于字符串编码的文章是this one, by stack exchange CEO, Joel Spolsky。它给了我知识,我需要了解为什么我的问题发生,而不是如何解决它。我知道UTF-8和UTF-16(以及我的数据库使用的Latin1_GENERAL_CI_AS)之间存在差异,但我不知道的是如何告诉我的Web应用程序的不同层以期望正确编码传入的字符串。

我知道在这个问题上有很多问题和答案,我的可能与其中的很多问题重叠。但是我花了很多时间在这上面,真的试着阅读源代码,文章和q&amp; a's,而我仍然无法使它工作。我确信我的知识上缺少一个链接,而且我很接近,但我绝对可以帮助找到我所缺少的内容,因为我显然无法自己找到它...

更新:我的数据收集和发送方式(“insertvalue”是一个字符串,用于触发动作类服务器端,在策略模式设置中。它运行正常,并且不应该不是这里的重点)

var jsonDataObject = new Object();
    jsonDataObject.value = "Æ Ø Å æ ø å";

    var jsonData = JSON.stringify(jsonDataObject);

    $.getJSON("insertvalue", {          
        json : jsonData
    }, function(data) {
        })
      .fail(function() {             
        alert( "Error" );
      })
      .always(function() {
      });
    return false;
    }

0 个答案:

没有答案