AJAX 가 GB 2312 의 중국어 인 코딩 으로 AJAX 특수 문자 인 코딩 을 전송 하 는 정확 한 방법

리 트 윗 과정 에서 일 그 러 지 거나 경험 증 이 없 으 면 리 트 윗 되 는 경우 가 많 습 니 다.실제로 사용 할 때 안 됩 니 다.이 를 통 해 전방위 적 으로 실험 해 보 겠 습 니 다.노력 이 헛 되 지 않 았 습 니 다.최종 적 으로 얻 은 결 과 는 간단 하지만 그 과정 은 AJAX 를 새로 배 운 사람 에 게 정말 힘 들 었 습 니 다.당신 이 사용 하 는 과정 에서 새로운 소감 에 대해 함께 댓 글 을 달 아 교류 하 는 것 을 환영 합 니 다.하나의 사상+하나의 사상 은 적어도 두 가지 사상 이 생 길 수 있 습 니 다.1.GET 에서 보 낼 때:방법 1:ASP 서버 에서 Response.charset="GB 2312"로 출력 인 코딩 을 호출 클 라 이언 트 에 게 정의 합 니 다.이때 클 라 이언 트 는 어떤 변환 을 하지 않 아 도 됩 니 다.다음 두 파일:1.클 라 이언 트 JS
 
var xmlHttp;
function createXML(){
if(window.ActiveXObject){
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}
}
function startXml(){
createXML();
xmlHttp.onreadystatechange = handleStateChange;
var url="ajaxtext.asp?tm=1&cc"+Math.random();
//var sendContents = 'theinput='+escape(theinput.value);
var regcode="2abc";
xmlHttp.open("get",url,true);
//regcode="regcode="+regcode;
//xmlHttp.setrequestheader("content-length",regcode.length); //
//xmlHttp.setRequestHeader("Cache-Control","no-cache");
//xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded'); //
//xmlHttp.send(null);
//xmlHttp.send("regcode="+escape(regcode));
xmlHttp.send(null);
}
function handleStateChange(){
if (xmlHttp.readyState == 4 && xmlHttp.status==200){
//var divid=document.getElementById("results");
retext=xmlHttp.responseText;
alert(retext);
//if(divid.hasChildNodes()){
// divid.removeChild(divid.childNodes[0]);
//}
//var result=document.createTextNode(xmlHttp.responseText);
//divid.appendChild(result);
//document.getElementById("results").innerHTML=xmlHttp.responseText;
}
}
서버 쪽:
 
<%Response.CodePage=936%>
<%Response.charset="GB2312"
dim reg
reg=Request("regcode")
Response.write " ・ " ' 。
%>
방법 2:클 라 이언 트 에서 함수 로 변환(인터넷 에서).
 
function gb2utf8(data){
var glbEncode = [];
gb2utf8_data = data;
execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2");
t=t.split("@");
var i=0,j=t.length,k;
while(++i<j) {
k=t[i].substring(0,4);
if(!glbEncode[k]) {
gb2utf8_char = eval("0x"+k);
execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
glbEncode[k]=escape(gb2utf8_char).substring(1,6);
}
t[i]=glbEncode[k]+t[i].substring(4);
}
gb2utf8_data = gb2utf8_char = null;
return unescape(t.join("%"));
}
이때 서버 측 에서 인 코딩 을 가리 키 지 않 으 면 AJAX 기본 값 은 UTF-8 이 고 클 라 이언 트 에 표시 할 수 없 으 며 이 함 수 를 사용 하면 됩 니 다.
 
retext=xmlHttp.responseText;
retext=gb2utf8(retext);
alert(retext);
3.불 여우 브 라 우 저 에서:구체 적 으로 참고 하 십시오.다음 글 은 불 여우 가 비교적 간단 합 니 다.그 는 xmlHttp.responseText 를 지원 할 수 있 습 니 다./FireFox,그러나 코드 를 간소화 하기 위해 서 는 위의 것 으로 직접 인 코딩 을 하 는 것 을 권장 합 니 다.하지만 통용 되 기 위해 서 는 POST 아래 에 소 개 된 방법 으로 하 자.2.POST 에서 보 낼 때:일반적인 중국어 에 대해 상기 GET 방법 은 POST 에서 도 가능 하지만 인터넷 에서 일부 기 호 는 표시 할 수 없 는 것 을 언급 했다.예 를 들 어 다음 글 에서'test·test+test',(중간 은 간격 번호)테스트 를 했 는데 서버 에서 인 코딩 을 정 한 후에 클 라 이언 트 에 출력 해도 표시 할 수 없다.글 에서 말 한 대로 발송 단 은 xmlHttp.send("regcode="+escape(regcode)를 사용 합 니 다.그 다음 에 서버 에서 받 은 데 이 터 를 두 개의 인 코딩 encodeURIComponent(escape(xxxxxx)에 끼 워 넣 으 면 테스트%25u7A5Eest%2520 test 가 나타 나 고 똑 같이 안 됩 니 다.또한 이 사고방식 은 옳지 않 아야 한다.이 글 이 인터넷 에서 옮 겨 쓸 때 그 자체 가 틀 렸 는 지 모르겠다.이치대로라면 클 라 이언 트 가 escape 인 코딩 으로 전송 한 후에 서버 에서 인 코딩 을 반대로 해 야 한다.혹은 REQUEST 자체 가 디 코딩 작용 을 한다.두 번,세 번 인 코딩 할 필요 가 없습니다.게다가 이 스 케 이 프 와 encodeURIComponent 도 특수 문자 인 코딩 을 할 수 없습니다.서버 에서 다음 과 같은 출력 을 했 습 니 다.
 
test2="test・test+test・ :"
Response.write test2&" “・” 。 ( AJAX , ):"
즉,서버 에서 같은 특수 문 자 를 직접 생 성 했 습 니 다.이 서버 엔 드 파일 은<%Response.charset="GB 2312"%>로 인 코딩 을 GB 2312 로 정의 하 였 습 니 다.그러나 출력 결 과 는 서버 에서 생 성 된 test 2="test·test+test·리 턴:"정상적으로 출력 할 수 있 고 받 은 AJAX 값 은 안 됩 니 다.클 라 이언 트 에서 JS 세 개의 인 코딩 매개 변수 인 escape()\encodeURI()\encodeURIComponent()를 모두 시험 해 보고 서버 에서 인 코딩 을 되 돌려 출력 해도 안 됩 니 다.이것 은 문자열 의 특수 기호 가 서버 에서 받 을 때 이미 변형 되 었 다 는 것 을 설명 한다.현재 문 제 는 인 코딩 전달 에 정의 되 었 습 니 다.이 문 제 를 설명 하기 위해 저 는 또 하나의 작은 테스트 를 했 습 니 다.바로 이 문자열 을 ASP 에 할당 하 는 변 수 를 ASP 변수 로 JS 에 할당 하 는 것 입 니 다.다음 과 같 습 니 다.
 
<%
para="test・test+test・/"
para=Server.urlencode(para)
%>
결 과 는 정상 입 니 다.이것 은 ASP 의 server.urlencode 가 특수 문자 인 코딩 을 완전 하 게 할 수 있다 는 것 을 충분히 설명 합 니 다.JS 는 아직 부족 합 니 다.그럼 이제 어 떡 해?정말 어 쩔 수 없 는 상황 에서 저 는 encodeURIComponent()가 encode()보다 더 많은 특수 문자 인 코딩 을 할 수 있다 는 것 을 생각 했 습 니 다.그러면 다 중 MD5 암호 화 처럼 강화 제 를 추가 하 는 것 도 좋 습 니 다.그래서 저 는 두 개의 encodeURIComponent()를 사 용 했 습 니 다.현재 코드 는:
 
xmlHttp.open("POST",url,true);
var regcode="<%=para%>";
xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=gb2312');
xmlHttp.send("regcode="+regcode);
위 에 클 라 이언 트 의 것 입 니 다.서버 쪽 을 다음 과 같이 바 꾸 었 습 니 다.
 
var regcode="test・test+test・/";
xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=gb2312');
xmlHttp.send("regcode="+encodeURIComponent(encodeURIComponent(regcode)));
드디어 AJAX 출력 의 특수 문 자 를 완벽 하 게 보 았 습 니 다.간격 번호 와+번호 가 모두 나 왔 습 니 다."test·test+test·/"더 검증 하기 위해 아래 encodeURIComponent 도 인 코딩 할 수 없 는 개별 특수 문 자 를 모두 추 가 했 습 니 다.다음 과 같 습 니 다.
 
<script language="javascript" runat="server">
function decodestr(str){
return decodeURIComponent(decodeURIComponent(str));
}
</script>
<%
dim reg
reg=Request("regcode")
test2="test・test+test・ :"
Response.write test2&" “・” 。 ( AJAX , ):"
Response.write decodestr(reg)
%>
결과 도 정상 입 니 다.정말 좋 습 니 다!그러나 일반적으로 AJAX 가 서버 에 보 내 는 데 이 터 는 응용 해 야 한다.그렇지 않 으 면 의미 가 없다.데이터 가 똑 같은 지 더 검증 하기 위해 나 는 서버 측 을 작은 수정 을 했다.다음 과 같다.
 
var regcode=" :! @ # $& * ( ・・) = : / ; ? + , 。";
매우 흥분 했다.클 라 이언 트 가'동일'을 출력 하면 안심 하고 전면적으로 응용 할 수 있 습 니 다.요약:1.AJAX 클 라 이언 트 는 encodeURIComponent()를 이중 으로 사용 하여 POST 에 대한 데이터 인 코딩 을 사용 합 니 다.2.서버 측 에서 decodeURIComponent()이중 으로 디 코딩 하면 됩 니 다.function decodestr(str){return decodeURIComponent(decodeURIComponent(str);}3.responseText 를 받 을 때 인 코딩 을 다시 할 필요 가 없습니다.직접:retext=xmlHttp.responseText;4.서버 쪽 의 이 줄 은 여전히 빠 질 수 없습니다.<%Response.charset="GB 2312"%>,일반적으로 ASP 파일 에는<%@LANGUAGE="VBSCRIPT"CODEPAGE="936"%>줄 이 있 습 니 다.그러나 이 줄 은 제거 할 수 있 습 니 다.<%Response.charset="GB 2312"%>만 제거 할 수 없습니다.그렇지 않 으 면 오류 가 발생 합 니 다.지금부터 encodeURIComponent()/decodeURIComponent()를 잘 외우 면 됩 니 다.첨부:다음 과 같은 몇 가지 인 코딩 방법 은 JS 매 뉴 얼 에서 따 왔 습 니 다.참고:escape()방법:ISO Latin 문자 집합 으로 지정 한 문자열 을 인 코딩 합 니 다.모든 빈 칸 문자,구두점 기호,특수 문자 및 기타 비 ASCII 문 자 는%x x 형식의 문자 인 코딩(xx 는 문자 집합 표 에 있 는 인 코딩 의 16 진수 와 같 습 니 다)으로 전 환 됩 니 다.예 를 들 어,스페이스 바 에 대응 하 는 인 코딩 은%20 입 니 다.unescape 방법 은 이와 반대 입 니 다.이 방법 으로 인 코딩 되 지 않 는 문자:@*/+주석:unescape()를 사용 하여 escape()인 코딩 된 문자열 을 디 코딩 할 수 있 습 니 다.그러나 ECMAScript v3 는 이러한 방법 을 사용 하 는 것 을 반대 합 니 다.decodeURI()와 decodeURIComponent()를 사용 하여 대체 합 니 다.encodeURI()방법:---뒤에 있 는 것 은 크기 의 i―"I"는 L 이 아니 라 아래 의 decodeURI 도 L 이 아 닙 니 다.URI 문자열 을 UTF-8 인 코딩 형식 으로 escape 형식의 문자열 로 변환 합 니 다.이 방법 으로 인 코딩 되 지 않 는 문자:!@#$&*()=:/;?+encodeURIComponent()방법:URI 문자열 을 UTF-8 인 코딩 형식 으로 escape 형식의 문자열 로 변환 합 니 다.encodeURI()에 비해 이 방법 은/등 문자 와 같은 더 많은 문 자 를 인 코딩 합 니 다.따라서 문자열 에 URI 의 몇 부분 이 포함 되 어 있다 면 이 방법 으로 인 코딩 을 할 수 없습니다.그렇지 않 으 면/문자 가 인 코딩 된 후에 URL 에 오류 가 표 시 됩 니 다.이 방법 으로 인 코딩 되 지 않 는 문자:!*()인용 내용 따라서 중국어 문자열 에 있어 서 문자열 인 코딩 형식 을 UTF-8 형식 으로 바 꾸 지 않 으 려 면(예 를 들 어 원 페이지 와 대상 페이지 의 charset 가 일치 할 때)escape 만 사용 해 야 합 니 다.페이지 가 GB 2312 또는 다른 인 코딩 이 고 인 자 를 받 는 페이지 가 UTF-8 인 코딩 이 라면 encodeURI 나 encodeURIComponent 를 사용 해 야 합 니 다.또한,encodeURI/encodeURIComponent 는 javascript 1.5 이후 도입 되 었 으 며,escape 는 javascript 1.0 버 전에 있 습 니 다.decodeURI()함수 decodeURI()함 수 는 encodeURI()함수 가 인 코딩 된 URI 를 디 코딩 할 수 있 습 니 다. var test1=http://www.w3school.com.cn/My first/document.write(encodeURI(test 1)+"
")document.write(decodeURI(test 1))
decodeURIComponent()함수:encodeURIComponent()함수 인 코딩 의 URI 를 디 코딩 할 수 있 습 니 다.unescape():escape 디 코딩.저자:비 물리 생명 블 로그 traindiy

좋은 웹페이지 즐겨찾기