우리는 주로 두 가지 형식의 제출을 통해 서버에 요청을 보냅니다 : URL과 양식. 형태는 일반적으로 문제가 없으며, 차량 문제는 주로 URL에 있습니다. 이전 블로그의 소개를 통해 URL에 의해 서버로 인코딩하는 요청을 보내는 프로세스가 너무 혼란 스럽다는 것을 알고 있습니다. 다른 운영 체제, 다른 브라우저 및 다른 웹 문자 세트는 완전히 다른 인코딩 결과로 이어집니다. 프로그래머가 모든 결과를 고려하고 싶다면 너무 무섭지 않습니까? 클라이언트가 하나의 인코딩 메소드 만 사용하여 서버에 요청을 발행하도록하는 방법이 있습니까?
가지다! 여기서 나는 주로 다음 방법을 제공합니다
1. JavaScript
JavaScript 인코딩을 사용해도 브라우저가 개입 할 수있는 기회는 없습니다. 인코딩 후 요청을 서버로 보내고 서버에서 해독하십시오. 이 메소드를 마스터 할 때는 JavaScript 인코딩의 세 가지 메소드가 필요합니다 : Escape (), encodeuri () 및 encodeUricomponent ().
탈출하다
지정된 문자열은 SIO 라틴 문자 세트를 사용하여 인코딩됩니다. 모든 비 ASCII 문자는 %XX 형식으로 문자열로 인코딩되며, 여기서 XX는 문자 세트의 문자에 해당하는 16 진수를 나타냅니다. 예를 들어, 형식에 해당하는 인코딩은 %20입니다. 해당 디코딩 방법은 Unescape ()입니다.
실제로 Escape ()는 URL 인코딩에 직접 사용할 수 없으며 실제 기능은 문자의 유니 코드 인코딩 된 값을 반환하는 것입니다. 예를 들어, 위의 "I AM CM"의 결과는 %U6211 %U662FCM이며, "I"의 해당 인코딩은 6211이고 "예"의 인코딩은 662F이고 "CM"의 인코딩은 CM입니다.
Escape ()는 "+"인코딩에 맞지 않습니다. 그러나 양식을 제출할 때 웹 페이지에 공백이 있으면 + 문자로 변환됩니다. 서버가 데이터를 처리하면 + 부호가 공간으로 처리됩니다. 따라서 사용할 때주의하십시오.
Encodeuri
전체 URL을 인코딩하면 UTF-8 형식을 사용하여 인코딩 된 문자열을 출력합니다. 그러나 Encodeuri는 ASCII 인코딩을 제외한 일부 특수 문자를 인코딩하지 않습니다. @ # $ & * () = : /; ? + '.
EncodeUricomponent ()
URI 문자열을 UTF-8 인코딩 형식으로 탈출 형식 문자열로 변환하십시오. Encodeuri와 비교하여 EncodeUricomponent는 더 강력하며 Encodeuri ()에서 인코딩되지 않은 기호 (; /? : @ & = + $, #)에 대해 인코딩됩니다. 그러나 EncodeUricomponent는 URL의 구성 요소 만 개별적으로 인코딩하며 전체 URL을 인코딩하는 데 사용되지 않습니다. 해당 디코드 함수 방법 디코드 아리코 어이 조합 요소입니다.
물론, 우리는 일반적으로 Encodeuri 파티를 사용하여 인코딩 작업을 수행합니다. 배경에서 두 번 소위 JavaScript 인코딩 및 디코딩은이 방법을 사용하는 것입니다. JavaScript 에서이 문제를 해결하기위한 두 가지 솔루션이 있습니다 : 하나의 트랜스 코딩 및 2 개의 트랜스 코딩 방법.
한 번 트랜스 코딩
JavaScript 트랜스 코딩 :
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (url);
트랜스 코딩 된 URL : http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%88%91%E6%98%AFCM
백엔드 처리 :
문자열 이름 = request.getParameter ( "name"); System.out.println ( "전경 수신 매개 변수 :" + name); name = new String (name.getBytes ( "iso-8859-1"), "UTF-8"); System.out.println ( "디코딩 된 매개 변수 :" + name);
출력 결과 :
프론트 데스크의 들어오는 매개 변수 : ?????? cm
매개 변수를 디코딩 한 후 : 나는 CM입니다
2 차 트랜스 코딩
자바 스크립트
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (encodeuri (url));
트랜스 코드 URL : http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25e6%2588%2591%25e6%2598%25afcm
백엔드 처리 :
문자열 이름 = request.getParameter ( "name"); System.out.println ( "전경 수신 매개 변수 :" + name); name = urldecoder.decode (이름, "utf-8"); System.out.println ( "디코딩 된 매개 변수 :" + name);
출력 결과 :
프론트 엔드 수신 매개 변수 : E68891E698AFCM
매개 변수를 디코딩 한 후 : 나는 CM입니다
필터
필터를 사용하여 필터 LZ는 두 가지 유형을 제공합니다. 첫 번째는 인코딩을 설정하는 것이며, 두 번째는 필터에서 직접 디코딩 작업을 수행하는 것입니다.
필터 1
이 필터는 요청의 인코딩 형식을 직접 설정합니다.
공개 클래스 캐릭터 encoding 구현 필터 {private filterconfig config; 문자열 인코딩 = null; public void destrove () {config = null; } public void dofilter (ServletRequest 요청, ServletRepsonge 응답, 필터 체인 체인) IoException, ServleTeXception {request.SetchAracterEncoding (인코딩); Chain.dofilter (요청, 응답); } public void init (FilterConfig config) servleTeXception {this.config = config; // 구성 매개 변수 가져 오기 문자열 str = config.getInitParameter ( "Encoding"); if (str! = null) {encoding = str; }}} 구성:
<filter> <filter-name> ChineseCodingFilter-Name> <filter-class> com.test.filter.characterencodingfilter-class> <Init-Param> <Param-Name> encodingparam-name> <param-value> utf-8param-value> init-param> 필터-<Filter-Name> chanese-name> <Url-pattern>/*url-pattern> 필터 매핑>
필터 2
처리 방법에서 필터는 매개 변수를 직접 디코딩 한 다음 디코딩 된 매개 변수를 요청 속성으로 재설정합니다.
공개 클래스 캐릭터 encoding 구현 필터 {Protected FilterConfig FilterConfig; 문자열 인코딩 = null; public void destrove () {this.filterconfig = null; } / *** 초기화* / public void init (FilterConfig FilterConfig) {this.filterConfig = FilterConfig; } / *** 기기를 UTF -8의 인코딩 형식으로 변환* @param instr String* @return utf -8의 인코딩 양식 문자열* @throws UnSupportedEncodingException* / private String toutf (String Inst)는 unsupportedEncodingException {String outstr = ""; if (inst! = null) {outstr = new String (instr.getBytes ( "iso-8859-1"), "utf-8"); } Outstr 리턴; } / *** 중국어 가블드 필터링 처리* / public void dofilter (ServletRequest ServletRequest, ServletResponse ServletResponse, FilterChain 체인)는 ioException, ServleTexception {HttpserVletRequest request = (httpservletRequest) servletRequest; httpservletresponse 응답 = (httpservletResponse) servletResponse; // 요청을 얻는 메소드 (1.post 또는 2.get) 및 다른 요청 방법에 따라 다른 처리가 수행됩니다. String Method = request.getMethod (); // 1. POST에 제출 된 요청의 경우, 인코딩을 UTF-8 If (method.equalSignoreCase ( "post")) {try {request.SetchAracterEncoding ( "UTF-8"); } catch (UnsupportedEncodingException e) {e.printstacktrace (); }} // 2. get else에 제출 된 요청 {// 클라이언트 열거에 의해 제출 된 매개 변수 세트를 꺼냅니다. // 각 매개 변수의 이름과 값을 얻기 위해 설정된 매개 변수를 통과하는 동안 (paramnames.hasmoreElements ()) {string name = paramnames.nextElement (); // 매개 변수 이름 값 [] = request.getParameterValues (이름)에 따라 값을 꺼내지 않으면 값이 비어 있지 않은 경우 (값! = null). (int i = 0; i <value.length; i ++) {try {// b 값 [i] = Vlust; } catch (UnsupportedEncodingException e) {e.printstacktrace (); }} // request request.setAttribute (이름, 값)에서 속성 형식으로 값을 숨 깁니다. }}} // 응답 메소드를 설정하고 중국어를 지원하십시오. // 다음 필터를 계속 실행합니다. 필터가없는 경우 요청 체인 .dofilter (요청, 응답); }}구성:
<filter> <filter-name> ChineseCodingFilter-Name> <Filter-Class> com.test.filter.CharacterEncodingFilter-Class> 필터> <Filter-Mapping> <Filter-Name> ChineseCodingFilter-Name> <Url-Pattern>/*url-pattern> 필터-맵핑>
다른
1. PageEncoding 및 ContentType를 설정하십시오
<%@ page language = "java"contenttype = "text/html;
charset = utf-8 "pageencoding ="utf-8 "%>
2. Tomcat의 uriencoding을 설정하십시오
기본적으로 Tomcat 서버는 ISO-8859-1 인코딩 형식을 사용하여 Uriencoding 매개 변수가 요청한 URL을 인코딩하므로 Tomcat의 Server.xml 파일의 태그에 uriencoding = "utf-8"만 추가하면됩니다.
위는이 기사에 관한 것입니다. 모든 사람이 자바 중국인이 멍청한 질문을 배우는 것이 도움이되기를 바랍니다.