이상 한 리 턴 문제.

클래스 유 닉 스에 서 는(0x0A)입 니 다.큰 문제 가 없 을 줄 알 았 는데 이번에 작은 프로그램 을 개발 하 는 것 이 나 로 하여 금 이 문제 에 대해 크게 골 치 아 프 게 했다.먼저 이 문 제 는 이 렇 습 니 다.제 프로그램 은 Extjs+phop 방식 으로 ajax 를 통 해 통신 합 니 다.그림 과 같은 페이지 가 있 습 니 다.두 텍스트 상자,하나의 text,하나의 textarea 가 있 습 니 다.textarea 에 리 턴 줄 이 있 을 때 스 크 립 트 오류 가 발생 합 니 다.서버 에서 되 돌아 오 는 문자열 이 줄 을 바 꾸 면 js 해석 에 오류 가 발생 할 수 있 기 때 문 입 니 다.이 를 통 해 js 가 json 데 이 터 를 분석 할 때 문법 이 로 컬 에서 정 의 된 문자열 변수의 문법 과 일치 하 는 것 을 알 수 있 습 니 다.한 문자열 이 여러 줄 로 되 어 있 지 않 습 니 다.줄 을 바 꿀 때 전의 기호 가 필요 합 니 다.(\r)그러나 이것 은 내 가 설명 하고 자 하 는 문제 가 아니다.내 가 설명 하고 자 하 는 문 제 는 내 가 이 문 제 를 해결 할 때 가방 을 잡 고 분석 할 때 재 미 있 는 현상 을 발견 한 것 이다.바로 브 라 우 저가 서버 에 전송 되 어 리 턴 줄 에 대한 인 코딩 이 일치 하지 않 는 다 는 것 이다.예 를 들 어 위의 그림 에 있 는 문자열 은 extjs
 
Ext.Ajax.request({
url:'CatMan.php',
form:this.FORM_NAME,
scope:this,
callback:function(o,s,r){
var retObj=Ext.decode(r.responseText);
if(retObj.success){
alert(' !');
}
}
});
를 통 해 저장 되 었 을 때 서버 에 보 내 는 인 코딩 이 이 렇 습 니 다.catdesc=%E6%9E%97%0A%0A%B0%910 A%0A%0Aa%E5%8D%8E 는 빨간색 태그 의%0A 를 주의 하 십시오.이것 은 인 코딩 입 니 다.\r 인 코딩 이 없어 졌어 요.그리고 제 가 formsubmit 을 사용 하여 직접 제출 하면 인 코딩 은%E6%9E%97%0D%0A%0D%0A%E0%B0%91%0D%0A%0D%0A%0D%0A%0Aa%E5%8D%8E 발견\r(%0D)인 코딩 이 있 습 니 다.(이상 은 IE9 에서 테스트 한 결과 입 니 다.)혹시 ExtJS 문제 인가요?Extjs 의 소스 코드 를 분석 하면 form 을 찾 을 만 한 곳 을 찾 습 니 다.다음 과 같다.
 
serializeForm : function(form) {
debugger
var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,
hasSubmit = false,
encoder = encodeURIComponent,
name,
data = '',
type,
hasValue;
Ext.each(fElements, function(element){
name = element.name;
type = element.type;
if (!element.disabled && name) {
if (/select-(one|multiple)/i.test(type)) {
Ext.each(element.options, function(opt){
if (opt.selected) {
hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified;
data += String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text));
}
});
} else if (!(/file|undefined|reset|button/i.test(type))) {
if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) {
data += encoder(name) + '=' + encoder(element.value) + '&';
hasSubmit = /submit/i.test(type);
}
}
}
});
return data.substr(0, data.length - 1);
},
extjs 는 js 중의 encodeURIComponent 함수 로 값 을 인 코딩 하 는 것 을 발견 할 수 있다.혹시 encodeURIComponent 의 문제 인가요?인터넷 을 검색 해 보 니 블 로그 에서 이 문 제 를 언급 한 것 을 발견 했다.http://www.yeahxj.com/2011/11/07/enter-code-for-all-browser/ (리 턴 문자\r 는 각 브 라 우 저 에서 파렴치한 표현)그래서 저 는 ie6,ie8,ie9 에서 각각 테스트 를 했 는데 과연 이 문제 가 존재 한 다 는 것 을 알 게 되 었 습 니 다.결론:이 문 제 는 작 지만 어떤 상황 에 서 는 사람 을 골 치 아 프 게 한다.이것 도 컴퓨터 프로 그래 밍 을 하 는 사람들의 슬픔 이다.대량의 불 균형 으로 인해 많은 프로그램 에 여러 가지 이상 한 문제 가 발생 한다.예 를 들 어 이 작은 문 제 는 하나의 결 과 를 가 져 올 수 있 습 니 다.예 를 들 어 저 는 이 프로그램 이 프론트 데스크 에 내용 을 표시 할 때 차 를 돌려 줄 을 바 꿔 야 합 니 다.일반적으로 두 가지 처리 방법 이 있 습 니 다.하 나 는
라벨 을 사용 하 는 것 입 니 다.그러나 이 라벨 은 사용 하기에 매우 불편 합 니 다.형식 변화 가 잘 제어 되 지 않 는 다 는 것 을 발견 하려 고 시도 합 니 다.또 다른 방법 은 리 턴 을
로 바 꾸 는 것 이다.저 는 이런 방법 을 사 용 했 습 니 다.처음에 제 가 쓴 정규 표현 식 은/\r/였 는데 아무것도 일치 하지 않 았 습 니 다.그 다음 에 저 는/[\r]로 바 꾸 었 습 니 다.그러나 이런 문 제 는 바로 ie6,7,8 에서 한 줄 이 더 나 올 것 입 니 다.마지막 으로 통일 적 으로 처리 하기 위해 서 나 는 먼저/\r/조합 을 교체 한 다음 에//로 바 꾸 었 다.문제 가 해결 되다.본인 이 창작 한 글,발췌 문 은 이 단락 의 내용 을 보존 해 주 십시오.대단히 감사합니다!**microdreamsoft(Lin Shaohua):**본인 의 수준 이 제한 되 어 있 기 때문에 고수 여러분 의 지적 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기