这段时间,在给一个地区门户网站(alexa全球排行1200左右)做SSO集成,其中的一个部分就是Web Services服务接口,以及客户端,我们采用的是REST方式,不是SOAP,大致就是客户端通过HTTP POST方式向服务器提交数据,如账号同步,服务器返回xml,给客户端反馈。但提交过程中中文问题出来了,因为账号中有个realName字段是中文。客户端有以下几种:
1、Java HTTP客户端(HttpURLConnection)
2、PHP客户端(curl库)
3、ajax 客户端(XMLHTTP)
4、普通表单提交(POST方式)
…..
开发上面四种客户端API和 demo都很快,现在就记录一下中文解决方案问题吧。
我之所以要发表出来,是因为我这儿的解决方式是自动化的,编码量最小,并且我进行了无数次尝试,确定怎样行,怎样不行,并找出原因。
注意:我只是说明了request的中文解决方案,并且只是POST方式,但只要是对这个很理解,response的中文也就很简单了。
开始时候,我也是采用了比较机械的,在服务器端servlet中将得到的参数值:
byte[] b = value.getBytes("ISO-8859-1");
output = new String(b,"UTF-8");
这样可以解决问题,而且都成功了,但必须在四种客户端发送的中文时候要进行encoding操作。最后我觉得这肯定不是最优解,因为工作量太大,于是决定重构。
将发往服务器的request都用filter拦截,主要就是下面这句话,其实这个方式非常old了,不值得一提。在doFilter里:
request.setCharacterEncoding(encoding);
也就是将到来的所有请求(还没有说到response呢)都用指定的编码(UTF-8)进行编码。
用filter,可以解决服务器移植的问题,如我最熟悉的Tomcat,resin,WL,WS。
我用axis (著名的Web Services SOAP引擎)附带的TCPMonitor来探测发出的POST请求。
Java HTTP客户端(HttpURLConnection):
必须将请求数据的key/value的value,进行编码:
URLEncoder.encode(value,"UTF-8")
;
PHP客户端(curl库):
同上,必须进行转码:
$truename = iconv("GBK", "UTF-8","陈志武");
因为我们PHP默认环境是中文
ajax客户端:
发送POST请求时,直接用中文,不需要用Javascript的encodeURI(),或者escape(),但是用了也不影响。
why?因为ajax POST方式默认是以UTF-8方式发送的。对已经编码的中文,也就是一些%E9%99%88%E5%BF%97%E6%AD%A6这样的正常符号了,服务器就忽略编码了,因为编和不编一个样。
注意,这两个函数对中文encode后结果不一样。用encodeURI()是以UTF-8编码,但没有其它编码类型可选择,这样,如果你的服务器端的filter用GBK默认,那么,就不能象这样自动处理。
所以,用ajax客户端时,必须慎重点。
普通表单提交(POST方式)
如果希望自动解决问题,在filter里对request请求编码设置为UTF-8的前提下,最好就是加入如下:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
如果charset为GBK,那么到Server端就是乱码的。
why?因为,用submit方式提交时,我们的提交的表单编码类型(enctype)是:
Content-Type: application/x-www-form-urlencoded,也就是说,提交的时候,我们的中文会自动进行编码,但依据就是上面的那个html指令。这个证据可以从TCPMonitor拦截的HTTP数据包里看到。
和上面的方式比较,ajax方式感觉是浏览器为我们建立了一个http通道,直接将中文提交上去了,和最前面介绍的两种一样。
在服务器端,我们的Java Web容器或应用服务器会自动给我们的request参数解码。将编码后的字符还原为本来面目。
如果你在控制台里面看到的都是正确的中文,你就可以抛开数据库这个存在编码问题了,但那个有时也有点麻烦。
分享到:
相关推荐
android客户端上传数据中文乱码3中解决方案 一种HttpPost两种HTTPURLCONNECTION
它可以发送GET、POST等各种HTTP方法的请求,接收响应数据,非常适合用来实现HTTP客户端。 2. WebRequest/WebResponse:虽然HttpClient是更现代的选择,但旧版.NET Framework中,Web请求通常通过WebRequest和...
本文将深入探讨这些知识点,并提供相应的解决方案。 首先,URL编码是因URL(统一资源定位符)中不能包含某些特殊字符或非ASCII字符而产生的需求。在Web应用程序中,我们可能会在URL中传递参数,例如查询字符串。...
在提供的文件列表中,`http2.sln`是一个Visual Studio解决方案文件,很可能包含了实现上述功能的项目。`http2`可能是源代码文件,里面可能包含了具体的C++实现。通过打开并研究这个项目,你可以更直观地学习如何将...
与常见的Web容器(如IIS或Apache)不同,`idHttpServer`提供了一个轻量级、可自定义的解决方案,可以直接处理HTTP请求,而无需复杂的中间件。在实际应用中,你可以编写处理函数来响应不同的HTTP方法,例如GET、POST...
本文将深入探讨Ajax中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**:服务器与客户端(浏览器)之间使用的字符编码格式不同,例如服务器使用GBK编码,而浏览器使用UTF-8编码...
本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Post方式与服务器端交互...
在IT领域,通过邮件交流代码、问题和解决方案是一种常见的方式。 通过上述介绍,我们可以了解到C语言实现HTTP POST Web通信涉及的主要技术点,以及Json在其中的作用。对于初学者和有经验的开发者来说,这些都是构建...
在Python编程语言中,HTTP(超文本传输协议)是网络通信的基础,用于客户端与服务器之间的数据交换。本文将深入探讨如何使用Python实现HTTP服务端和...通过这些文件,开发者可以构建和测试自己的HTTP通信解决方案。
文章描述了作者在 Fedora34 上安装百度网盘客户端时遇到的问题,以及后来使用 Java 语言开发的百度网盘客户端的解决方案。该客户端支持字符用户交互界面和命令行方式执行,可以方便通过脚本或后台方式执行。 标签...
JQuery的跨域解决方案主要依赖于JSONP(JSON with Padding)技术。JSONP是一种绕过同源策略的方式,它利用HTML中的`<script>`标签没有同源策略限制的特点。当jQuery使用`dataType: 'jsonp'`时,它实际上是在做以下几...
Venice的设计灵感来源于Apple的URLSession,但它的目标是提供更灵活和可扩展的解决方案,特别是对于那些需要自定义网络层或者需要跨平台支持的项目。 首先,让我们了解HTTP客户端的基本概念。HTTP客户端是一个能够...
JSPrintManager从Javascript打印命令和文件,管理打印机和扫描文档是针对客户端打印和扫描方案的Javascript + Client App解决方案,旨在用于在任何Web平台(如ASP.NET,PHP,Django,Ruby On Rails(RoR),Express....
### 二、解决方案:修改Web.config文件 在C#和ASP.NET项目中,可以通过修改项目的配置文件——`Web.config`来统一客户端和服务器端的字符编码,从而避免乱码问题的发生。 #### 步骤1:定位到Web.config文件 打开...
而`commons-logging.jar`是Apache Commons Logging库,用于提供灵活的日志记录解决方案,它可以在多种日志框架之间进行选择,如log4j。`log4j-1.2.13.jar`则是Apache Log4j的一个版本,是一个流行的Java日志框架,...
".sln"和".suo"文件是Visual Studio的解决方案文件和用户选项文件,它们包含了项目的配置信息和用户设置。 在实际开发中,你可能需要处理更多细节,如错误处理、安全性、性能优化等。这个简单的示例为你提供了一个...
在网络通信中,HTTP(超文本传输协议)是客户端与服务器之间进行数据交换的主要方式之一。HTTP定义了一系列请求方法来规范交互过程,包括但不限于GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE等。虽然这些方法各有...
JavaScript跨域访问解决方案 在Web开发中,JavaScript的同源策略是浏览器为了保障用户安全而实施的一项重要机制。它限制了脚本只能访问与当前页面具有相同协议(如http或https)、主机名和端口号的资源。然而,在...
3. **Access数据库存储**:项目采用Microsoft Access作为数据存储解决方案,存储用户的账户信息、邮件元数据等。Access是一个关系型数据库管理系统,适合小型应用,易于集成到.NET应用程序中,且提供了ADO.NET接口...
- `TestHttpPost.sln`:解决方案文件,包含了项目的所有相关信息,用于Visual Studio打开和管理项目。 - `bin`和`Properties`:这两个是常规的项目目录,`bin`包含了编译后的可执行文件和依赖项,`Properties`包含...