2012-04-28 3 views
3

encodeURIcomponent을 사용하여 현재 페이지의 URL을 서버 측에 전달하는 자바 스크립트 북마크를 가지고 서버 측에 urldecode을 사용하여 문자를 다시 가져옵니다.인코딩되지 않은 utf-8 문자를 인코딩하고 그에 따라 디코딩하는 올바른 방법은 무엇입니까?

인코딩 된 문자가 utf-8이 아닌 경우 (gb2312이지만 다른 것일 수 있음) 서버가 urldecode 일 때 문제가 발생합니다. 디코딩 된 문자는 정사각형이됩니다. 분명히 인코딩 전의 모습이 아닌 것입니다.

책갈피 렛입니다. 입력 내용은 아무 것도 될 수 없으므로 js에서 "gb2312로 인코딩"을 정의하거나 PHP 스크립트에서 "gb2312로 디코딩"을 정의 할 수 없습니다.

그래서 문자 인코딩을 내용과 함께 전달하는 올바른 방법은 encodeURIcomponent이며 디코딩은 올바른 인코딩을 선택하여 디코딩 할 수 있습니까? 브라우저의 인코딩

답변

0

, 특히 GB2312 캐릭터 세트를 들면,

첫 번째 (중국어) 다음과 같은 문서를 확인, %C8%B7%B6%A8 실제로에서 생성됩니다 '\u786e\u5b9a'의 GB2312 형식. 사용자가 위치 표시 줄에 중국어 문자를 직접 입력하면
또는의 IRI에서 URI 인코딩을 수행하지 않는 페이지 콘텐츠의 비표준 링크를 사용하는 경우 (기존 버전) 정상적으로 발생합니다. 모두는 단지 '/tag/\xc8\xb7\xb6\xa8'과 같은 이진 문자열을 렌더링합니다 (douban.com은 태그 용으로이 용도를 사용 했었지만 이제는 UTF8에서 올바른 URI 인코딩을 사용하고 있습니다). 크롬에서 재현 할 수 없기 때문에 FF와 IE에서 테스트 할 수 있으므로 doubque에 관한 부분은 사실입니다.

사실, encodeURIComponent의 올바른 출력은 서버 측에 따라서

> encodeURIComponent('%C8%B7%B6%A8') 
    "%25C8%25B7%25B6%25A8" 

, 인용되지 않은 문자열이 ASCII가 아닌 바이트를 포함 할 때, 당신이 여기 '%C8%B7%B6%A8' 같이 문자열을 떠나 더 나은 거라고해야한다.

또한, 클라이언트 측에서 검사는 XX가 0x7F보다 큰 경우 %XX 포함 된 값에 다시 encodeURIComponent을 적용 할 수 있습니다. 나는 이것이 RFC 2396에 대한 것인지는 잘 모르겠다.

写 英文 好累 啊, 还是 要 入乡随俗 ~

+0

좋은 소스, 내가 그들을 확인합니다 :) – lazycai

0

不过 escape()을 사용하여 다음 서버로 보내기 전에 numeric character reference에 문자를 번역합니다. MDN escape() reference 가입일

%의 XX :

코드 부 0xFF 값 이하 인 문자의 16 진수 형태, 두 자리 이스케이프 시퀀스이다. 코드 단위가 더 큰 문자의 경우 네 자리 숫자 형식 % uxxxx이 (가) 사용됩니다.

escape(input_value).replace(/%u([0-9a-fA-F]{4})/g, '&#x$1;'); 

또는 서버 측 언어는 소수 단체를 지원하는 경우, 사용 :

따라서, 간단한 replace() 문을 사용하여 숫자 문자 참조에 escape()의 출력을 변환 쉽게

PHP에서
escape(input_value).replace(/%u([0-9a-fA-F]{4})/g, function(m0, m1) { 
       return '&#' + parseInt(m1, 16) + ';'; 
}; 

예제 코드

client.html(파일 인코딩 : GB2312) :

<html> 
    <head> 
    <meta charset="gb2312"> 
    <script> 
    function processForm(form) { 
     console.log('BEFORE:', form.test.value); 
     form.test.value = escape(form.test.value).replace(/%u(\w{4})/g, function(m0, m1) { 
      return '&#' + parseInt(m1, 16) + ';'; 
     }); 
     console.log('AFTER:', form.test.value); 
     return true; 
    } 
    </script> 
    </head> 
    <body> 
    <form method="post" action="server.php" onsubmit="return processForm(this);"> 
     <input type="text" name="test" value="确定"> 
     <input type="submit"> 
    </form> 
    </body> 
</html> 

server.php :

<?php 
echo '<script>console.log("', 
    $_REQUEST['test'], ' --> ', 
    mb_decode_numericentity($_REQUEST['test'], array(0x80, 0xffff, 0, 0xffff), 'UTF-8'), 
    '");</script>'; 
?> 
관련 문제