我有一个JQuery脚本将表单字段的内容发布到一个简单的servlet。当我在表单字段中放入中文字符(在utf8中)并使用JQuery .ajax()方法发布时,服务器将字符视为问号(欢迎进入智慧的十年被视为?????????? ?在服务器上。)
$.ajax({
url: '/url-on-server',
type: 'POST',
data: 'action=SEND&'+ $('#text-field').val()),
success: function(){},
dataType: 'json'
}
我已经使用FIREBUG和Liveheaders检查了这个请求,他们看起来正确......
Content-Type text/plain; charset=UTF-8
我认为当我将html表单更改为post而不使用JQuery脚本时,它不是服务器端的事情。我可以在服务器端看到中文字符而不改变任何内容。
另一条线索......
当我使用JQuery $ .ajax()方法发布表单时。这就是LiveHeaders中的请求......
action=SEND&msg=%E6%AC%A2%E8%BF%8E%E8%BF%9B%E5%85%A5%E6%99%BA%E6%85%A7%E7%9A%84%E5%8D%81%E5%B9%B4
但是,当我使用传统的web1.0方式发布表单时,这就是我在实时标题中看到的内容。
action=SEND&msg=%26%2327426%3B%26%2336814%3B%26%2336827%3B%26%2320837%3B%26%2326234%3B%26%2324935%3B%26%2330340%3B%26%2321313%3B%26%2324180%3B
正如您所看到的那样,似乎是以不同的方式对参数进行编码,但我无法向Google解释或解决此问题。
提前感谢您的帮助。
答案 0 :(得分:0)
第一个:
action=SEND&msg=%E6%AC%A2%E8%BF%8E%E8%BF%9B%E5%85%A5%E6%99%BA%E6%85%A7%E7%9A%84%E5%8D%81%E5%B9%B4
...是字符串的URL转义表单:
action=SEND&msg=欢迎进入智慧的十年
第二个:
action=SEND&msg=%26%2327426%3B%26%2336814%3B%26%2336827%3B%26%2320837%3B%26%2326234%3B%26%2324935%3B%26%2330340%3B%26%2321313%3B%26%2324180%3B
...是UTF-8字符串的URL转义表单:
action=SEND&msg=欢迎进入智慧的十年
我认为(我没有检查过)那些HTML实体是你的亚洲字符。但是,我不认为在x-www-form-urlencoded事物中发送HTML实体是有效的 - 应该使用角色本身,所以我很惊讶你看到了。在快速测试中,将您的亚洲字符串提交到http://www.opinionatedgeek.com/dotnet/tools/base64decode/(我能找到的第一个POST表单),我得到的例子,而不是第二个。你确定第二个是传输的吗? (我查看Wireshark)什么浏览器,表单是如何构建的?等等。