使用 jquery 将 UTF-8 字符串发布到 servlet

Posted

技术标签:

【中文标题】使用 jquery 将 UTF-8 字符串发布到 servlet【英文标题】:Post a UTF-8 string to a servlet using jquery 【发布时间】:2012-03-25 09:18:35 【问题描述】:

我正在尝试将 UTF-8 字符串发布到我的 servlet(托管在 TomCat 中),但在服务器端读取的字符串不是 UTF-8。我已经通过 firebug 验证了 ajax 标头的内容类型具有 utf-8 编码集。我将“MÉXICO”发布到服务器,但收到“MÉXICO”。

$.ajaxSetup( 
    scriptCharset: "utf-8" , 
    contentType: "application/x-www-form-urlencoded; charset=UTF-8"
);


$.ajax(
  url: "SetData",
  type: 'POST',
  data: 'MÉXICO',
  success: function()
      console.log('Data set');
  
);

这是servlet中的java代码

request.setCharacterEncoding("UTF-8");
BufferedReader reader = new BufferedReader( new InputStreamReader( request, "UTF-8" ) );        
char[] chr = new char[5];
reader.read( chr );
builder.append( chr );

更新 1

我将 js 中的发布数据更改为 encodeURIComponent('MÉXICO') 但服务器仍然读取“MÉXICO”。

但是,如果我得到 encodeURIComponent('MÉXICO') 的字符串值,即'M%C3%89XICO',它就可以工作! 我被电死了!知道为什么这应该有效吗?

$.ajax(
  url: "SetData",
  type: 'POST',
  //data: 'MÉXICO', ** does not work
  //data: encodeURIComponent('MÉXICO'),  ** does not work
  data: 'M%C3%89XICO',  //works !!!!
  success: function()
      console.log('Data set');
  
)

;

【问题讨论】:

最后,弄清楚为什么当字符串没有被硬编码时没有被唤醒。我没有设置文档的字符编码!谢谢大家! 【参考方案1】:

我不明白你在做什么以及你发送什么样的请求参数。代码不应该是这样的:

...
data:key:'MÉXICO',
...

...
data:key:encodeURIComponent('MÉXICO'),
...

在 servlet 中与

...
request.getParameter('key')
...

 stringURLDecoder.decode(
                             request.getParameter('key').toString(),
                             'UTF-8'
                        );

或者我什么都不懂(如果是这种情况对不起:/)

【讨论】:

+1 即使这不能解决 OP 的要求,重要的是要注意您需要以您指定的格式发送数据。在这种情况下,他说是application/x-www-form-urlencoded 我刚刚尝试了您的建议,但都没有奏效。我仍然在服务器上获得 MÉXICO。还是谢谢! DMoses:我应该将 contentType 更改为什么? 如果您总是计划对其进行编码,这很好。 对不起,我认为我在解释协议中的字节编码而不是将其全部保存在应用程序空间中走错了路。我应该遵循封装规则。我删除了我的答案,因为它与在 Web 服务环境中很重要的协议级别有关。【参考方案2】:

尝试使用 encodeURIComponent() 编码数据值

data: encodeURIComponent('MÉXICO')

来源:JQuery AJAX is not sending UTF-8 to my server, only in IE

【讨论】:

他正在使用 POST。所以我认为这与他无关。 不走运!我什至更改了 servlet 代码来解码 stringURLDecoder.decode(builder.toString(), "UTF-8"); 也许这有助于***.com/questions/607176/…

以上是关于使用 jquery 将 UTF-8 字符串发布到 servlet的主要内容,如果未能解决你的问题,请参考以下文章

在chrome更新后,jQuery ajax调用无法从网页解码到utf-8字符集到Chrome扩展

jQuery 将 ISO 字符集设置为 ajax 请求

将 ISO-8859-1 转换为 UTF-8 [重复]

如何使用 Notepad++ 将 ANSI 编码文件转换为 UTF-8? [关闭]

将 UTF-8 BOM 添加到字符串/Blob

使用 jquery 将 XML 字符串映射到 HTML 页面