해결 방법은 다음과 같습니다.
1. JS에서 중국어 매개변수를 두 번 변환합니다
var login_name = document.getElementById("loginname").value
로그인_이름 = encodeURI(로그인_이름)
로그인_이름 = encodeURI(로그인_이름)
2. 서버 측에서 매개변수 디코딩
String loginName = ParamUtil.getString(request, "login_name")
loginName = java.net.URLDecoder.decode(loginName,"UTF-8")
URL을 사용하여 매개변수를 전달할 때 중국어 이름이나 URL 주소가 포함된 일부 매개변수가 전달되는 경우가 많으며 백그라운드 처리 중에 변환 오류가 발생합니다. 일부 배달 페이지에서는 GB2312가 사용되고, 수신 페이지에서는 UTF8이 사용되므로 수신된 매개변수가 원래 매개변수와 일치하지 않을 수 있습니다. 서버측 urlEncode 함수를 사용하여 인코딩된 URL과 클라이언트측 javascript의 encodeURI 함수를 사용하여 인코딩된 URL 간에 결과가 다릅니다.
자바스크립트 인코딩 방법:
escape() 메서드:
ISO 라틴 문자 세트를 사용하여 지정된 문자열을 인코딩합니다. 모든 공백, 구두점, 특수 문자 및 기타 비ASCII 문자는 %xx 형식의 문자 인코딩으로 변환됩니다(xx는 문자 집합 테이블에 있는 문자 인코딩의 16진수와 동일합니다). 예를 들어 공백 문자에 해당하는 인코딩은 입니다. 이스케이프 해제 방법은 그 반대입니다. 이 방법으로 인코딩되지 않는 문자: @ * /
gb2312로 인코딩된 경우 이스케이프를 사용할 수 있지만 encodeURIComponent를 사용할 수 없습니다. 그렇지 않으면 왜곡됩니다.
이스케이프 사용 방법:
http://www.jb51.net/w3school/jsref/jsref_escape.htm
영어 설명: MSDN JScript 참조: 이스케이프 메서드는 [인수]의 내용을 포함하는 문자열 값(유니코드 형식)을 반환합니다. 모든 공백, 구두점, 악센트 문자 및 기타 비ASCII 문자는 %xx 인코딩으로 대체됩니다. , 여기서 xx는 문자를 나타내는 16진수에 해당합니다. 예를 들어 공백은 "
으로 반환됩니다.
Edge Core Javascript 가이드: escape 및 unescape 함수를 사용하면 문자열을 인코딩하고 디코딩할 수 있습니다. unescape 함수는 지정된 16진수 인코딩 값에 대한 ASCII 문자열을 반환합니다. >
encodeURI() 메서드: UTF-8 인코딩 형식을 사용하여 URI 문자열을 이스케이프 형식 문자열로 변환합니다. 이 방법으로 인코딩되지 않는 문자: ! @ # $& * ( ) = : / ?
영어 설명: MSDN JScript 참조: encodeURI 메서드는 인코딩된 URI를 반환합니다. 결과를 decodeURI에 전달하면 encodeURI 메서드는 ":", "/", ";" 문자를 인코딩하지 않습니다. 및 "?"를 사용하여 이러한 문자를 인코딩합니다. Edge Core Javascript 가이드: 특정 문자의 각 인스턴스를 UTF-8 인코딩을 나타내는 1개, 2개 또는 3개의 이스케이프 시퀀스로 대체하여 URI(Uniform Resource Identifier)를 인코딩합니다. 캐릭터
encodeURIComponent() 메서드: UTF-8 인코딩 형식을 사용하여 URI 문자열을 이스케이프 형식 문자열로 변환합니다. encodeURI()와 비교하여 이 메서드는 / 및 기타 문자와 같은 더 많은 문자를 인코딩합니다. 따라서 문자열에 URI의 여러 부분이 포함되어 있으면 이 방법을 사용하여 인코딩할 수 없습니다. 그렇지 않으면 / 문자가 인코딩된 후 URL에 오류가 표시됩니다. 이 방법으로 인코딩되지 않는 문자: ! * ( )
영어 설명: MSDN JScript 참조: encodeURIComponent 메서드는 결과를 decodeURIComponent에 전달하면 원래 문자열이 반환됩니다. encodeURIComponent 메서드는 모든 문자를 인코딩하므로 문자열이 /folder1/과 같은 경로를 나타내는 경우 주의하세요. 폴더2/default.html. 슬래시 문자는 인코딩되며 웹 서버에 요청으로 전송되는 경우 유효하지 않습니다. 문자열에 둘 이상의 URI 구성 요소가 포함되어 있으면 encodeURI 메소드를 사용하세요. 특정 문자의 각 인스턴스를 문자의 UTF-8 인코딩을 나타내는 1개, 2개 또는 3개의 이스케이프 시퀀스로 바꾸는 URI(Uniform Resource Identifier) 구성 요소입니다.
따라서 중국어 문자열의 경우 문자열 인코딩 형식을 UTF-8 형식으로 변환하지 않으려면(예: 원본 페이지와 대상 페이지의 문자 집합이 동일한 경우) 이스케이프만 사용하면 됩니다. 페이지가 GB2312 또는 기타 인코딩이고 매개변수를 허용하는 페이지가 UTF-8로 인코딩된 경우 encodeURI 또는 encodeURIComponent를 사용해야 합니다.
또한 javascript1.5 이후에 encodeURI/encodeURIComponent가 도입되었으며, javascript1.0에서는 escape가 가능했습니다.
탈출() 메소드는 서버 측에서 공백으로 해석되거나 해당 필드에 공백이 있는 양식에 의해 생성되는 문자를 인코딩하지 않습니다. 이러한 단점으로 인해 가능하면 escape() 사용을 피해야 합니다. 가장 좋은 대안은 일반적으로 encodeURIComponent()입니다. encodeURI() 메서드의 사용은 URL의 일부인 쿼리 문자열과 달리 URI [REF]를 인코딩한다는 점에서 escape()보다 조금 더 전문화되어 있습니다. URI를 사용하고 특정 문자를 인코딩되지 않은 상태로 유지해야 하는 리소스에 사용할 문자열을 인코딩해야 하는 경우 이 방법을 사용합니다. ' 문자는 URI 내에서 유효한 문자이므로 이 메소드는 인코딩하지 않습니다. 마지막으로, URI의 단일 구성 요소를 인코딩할 때 대부분의 경우 encodeURIComponent() 메소드를 사용해야 합니다. 이 방법은 일반적으로 URI의 특수 문자로 인식되는 특정 문자를 인코딩하여 많은 구성 요소가 포함될 수 있도록 합니다. ' 문자는 URI 내에서 유효한 문자이므로 이 방법은 인코딩하지 않습니다.