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;
}
}

서버 쪽:
 
  

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(++ik=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 , ):"

즉, 서버 쪽 에 똑 같은 특수 문 자 를 직접 생 성 하 는 것 입 니 다. 이 서버 쪽 파일 은 GB 2312 로 정의 되 어 있 습 니 다.그러나 출력 결 과 는 서버 에서 생 성 된 test 2 = "test · test + test · 리 턴:" 정상적으로 출력 할 수 있 고 받 은 AJAX 값 은 안 됩 니 다.
클 라 이언 트 에서 JS 세 개의 인 코딩 매개 변수 인 escape () \ encodeURI () \ encodeURIComponent () 를 모두 시험 해 보고 서버 에서 인 코딩 을 되 돌려 출력 해도 안 됩 니 다.이것 은 문자열 의 특수 기호 가 서버 에서 받 을 때 이미 변형 되 었 다 는 것 을 설명 한다.
현재 문 제 는 인 코딩 전달 에 정의 되 었 습 니 다. 이 문 제 를 설명 하기 위해 저 는 작은 테스트 를 했 습 니 다. 바로 이 문자열 을 ASP 에 할당 하 는 변 수 를 ASP 변수 로 JS 에 할당 하 는 것 입 니 다. 다음 과 같 습 니 다.
 
  
para="test・test+test・/"
para=Server.urlencode(para)
%>

그리고 JS 변 수 를 다음 과 같이 바 꿉 니 다.
 
  
xmlHttp.open("POST",url,true);
var regcode="";
xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=gb2312');
xmlHttp.send("regcode="+regcode);

결 과 는 정상 입 니 다. 이것 은 ASP 의 server. urlencode 가 특수 문자 인 코딩 을 완전 하 게 할 수 있다 는 것 을 충분히 설명 합 니 다.JS 는 아직 부족 합 니 다.
그럼 이제 어 떡 해?
정말 어 쩔 수 없 는 상황 에서 저 는 encodeURIComponent () 가 encode () 보다 더 많은 특수 문자 인 코딩 을 할 수 있다 는 것 을 생각 했 습 니 다. 그러면 다 중 MD5 암호 화 처럼 강화 제 를 추가 하 는 것 도 좋 습 니 다. 그래서 저 는 두 개의 encodeURIComponent () 를 사 용 했 습 니 다. 현재 코드 는:
 
  
var regcode="test・test+test・/";
xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=gb2312');
xmlHttp.send("regcode="+encodeURIComponent(encodeURIComponent(regcode)));

위 는 클 라 이언 트 의 것 이 고 서버 쪽 을 다음 과 같이 바 꿉 니 다.
 
  
<br>function decodestr(str){ <br>return decodeURIComponent(decodeURIComponent(str)); <br>} <br>
dim reg
reg=Request("regcode")
test2="test・test+test・ :"
Response.write test2&" “・” 。 ( AJAX , ):"
Response.write decodestr(reg)
%>

드디어 AJAX 출력의 특수 문 자 를 완벽 하 게 보 았 다.간격 번호 와 + 번호 가 모두 나 왔 습 니 다.
“test・test+test・/”
더 검증 하기 위해 서 저 는 아래 encodeURIComponent 에서 도 인 코딩 할 수 없 는 개별 특수 문 자 를 모두 추 가 했 습 니 다. 다음 과 같 습 니 다.
 
  
var regcode=" :! @ # $& * ( ・・) = : / ; ? + , 。";

결과 도 정상 이 야, 너무 좋아!
그러나 일반적으로 AJAX 가 서버 에 전송 하 는 데 이 터 는 응용 해 야 합 니 다. 그렇지 않 으 면 의미 가 없습니다. 데이터 가 똑 같은 지 더 검증 하기 위해 저 는 서버 측 을 작은 수정 을 했 습 니 다. 다음 과 같 습 니 다.
 
  
dim reg
reg=Request("regcode")
test2=" :! @ # $& * ( ・・) = : / ; ? + , 。"
IF test2<>decodestr(reg) Then
Response.write " "
Else
Response.write " "
End IF
%>

흥분했어클 라 이언 트 가 '동일' 을 출력 하면 안심 하고 전면적으로 응용 할 수 있 습 니 다.
요약:
1. AJAX 클 라 이언 트 는 POST 에 대한 데이터 인 코딩 을 encodeURIComponent () 로 이중 으로 사용 합 니 다.
2. 서버 측 에서 decodeURIComponent () 로 이중 디 코딩 하면 됩 니 다.
<br>function decodestr(str){
<br>return decodeURIComponent(decodeURIComponent(str));
<br>}
<br>
3. responseText 를 받 을 때 인 코딩 을 다시 할 필요 가 없습니다.직접: retext = xmlHttp. responseText;
4. 서버 쪽 의 이 줄 은 아직도 없어 서 는 안 됩 니 다. 보통 ASP 파일 에 이 줄 이 있 지만 이 줄 은 지 울 수 있 습 니 다. 유독 지 울 수 없습니다. 그렇지 않 으 면 오류 가 발생 합 니 다.
지금부터 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 를 디 코딩 할 수 있 습 니 다.
<br>
<br>var test1=http://www.w3school.com.cn/My first/
<br>document.write(encodeURI(test1)+ "<br />")
<br>document.write(decodeURI(test1))
<br>
decodeURIComponent () 함수: encodeURIComponent () 함수 인 코딩 의 URI 를 디 코딩 할 수 있 습 니 다.
unescape (): escape 디 코딩.
저자: 비 물리 생명 블 로그 traindiy

좋은 웹페이지 즐겨찾기