2010-05-18 2 views

답변

9

있다. URL 인코딩과 비슷하지만 호환되지 않습니다. 그것을 전혀 사용하는 것은 대개 실수입니다.

가장 좋은 방법은 적절한 URL 인코딩 (encodeURIComponent())을 대신 사용하여 생성하는 스크립트를 변경하는 것입니다. 그런 다음 서버 측에서 urldecode 또는 다른 일반 URL 디코딩 기능을 사용하여 디코딩 할 수 있습니다.

이 비표준 형식의 데이터를 반드시 교환해야하는 경우 사용자 지정 디코더를 작성해야합니다.

function jsunescape($s) { 
    $s= preg_replace('/%u(....)/', '&#x$1;', $s); 
    $s= preg_replace('/%(..)/', '&#x$1;', $s); 
    return html_entity_decode($s, ENT_COMPAT, 'utf-8'); 
} 

이렇게하면 원시 UTF-8 바이트 문자열을 반환합니다. Ру...과 같은 HTML 문자 참조를 원할 경우 html_entity_decode 호출을 중단하십시오. 그러나 일반적으로 당신은하지 않습니다. 최종 출력을 위해 이스케이프해야 할 때까지 문자열을 원시 형식으로 유지하는 것이 가장 좋습니다. 실제로 필요하지 않은 한 비 ASCII 문자를 문자 참조로 바꾸지 않는 것이 가장 좋습니다. 이 같은 일부 문자열이 내게 올 경우 어떤

'%의 CE의 % EB %의의 E5 %의 E3 + % DF % EA % F3 %의 F8 키 %의 EA의 %의 E8 %의 ED'

URL 형태의

-encoded이며 escape() 형식과 직접 호환되지 않습니다. URL 인코딩의 2 자리 바이트 이스케이프는 미친 escape - 형식 4 자리 코드 단위 이스케이프와 다르지만 문자 +은 모호합니다. 플러스 (문자열이 escape에서 온 경우) 또는 공백 (브라우저 양식 제출에서 온 경우)을 의미 할 수 있습니다. 그것이 어느 것인지 알 방법이 없습니다. 이것은 escape()을 사용하지 않는 또 다른 이유입니다.

이 캐릭터 세트의 캐릭터 세트가 UTF-8의 경우는, 위의 함수는 URL encode 된 바이트와 미완료의 escape() -format Unicode 문자를 그대로의 UTF-8 바이트로 변환 해, 괜찮습니다.

실제로 코드 페이지 1251 (Windows 러시아어) 인 것으로 보입니다. cp1251에서 모든 문자열을 정말로 처리하고 싶습니까? 그렇다면 네 자리 이스케이프를 다른 문자 집합으로 인코딩하도록 비트를 약간 변경해야합니다. 이 더러워 :

function url_or_maybe_jsescape_decode($s, $charset, $isform) { 
    if ($isform) 
     $s= str_replace('+', ' ', $s); 
    $s= preg_replace('/%u(....)/', '&#x$1;', $s); 
    $s= preg_replace('/%(..)/', '&!#x$1;', $s); 
    $s= html_entity_decode($s, ENT_COMPAT, $charset); 
    $s= str_replace('&!', '&', $s); 
    $s= html_entity_decode($s, ENT_COMPAT, 'utf-8'); 
    return $s; 
} 

echo url_or_maybe_jsescape_decode('%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED', 'cp1251', TRUE); 

나는 강력하게 추천 할 것입니다 :

  1. 가 적절한 encodeURIComponent하지 escape을 사용하도록 플래시 파일을 수정,이 추한 대신 표준 URL 디코더를 사용할 수 있도록 마구 자르기.

  2. 대신 UTF-8을 사용하여 러시아어 이외의 언어도 지원할 수 있으므로 제출 양식의 입력 인코딩이 변경되는 것에 대해 걱정할 필요가 없습니다.

(모든 인코딩은 UTF-8을 사용하지 않으며 과학에서 입증 된 사실입니다!)

+0

(플래시를 사용하는 동안)하지만 어떻게하면이 문자열이 나에게 올 것인가? '% CE % EB % E5 % E3 + % DF % EA % F3 % F8 % EA % E8 % ED' ? – Rella

+0

브라우저에 표시 될 때 Олег Якушкин와 같은 강철 모양을 의미합니까? – Rella

+0

마지막으로 JavaScript의 'escape()'와 적절한 URL 인코딩 간의 비 호환성을 다루는 완전한 대답 (해결 방법 제공)이 가능합니다. - 질문 제목을 표현하면 미래 세대가 이익을 얻을 수 있습니다. –

2

PHP escape() 자바 스크립트 형식의 복호화 함수

$string = html_entity_decode($string,ENT_COMPAT,"UTF-8") 
+0

은 ENT_COMPAT은 무엇을 의미합니까? – Rella

+0

이것은 HTML 디코더입니다. '% u ....'는 HTML로 인코딩되어 있지 않습니다. – bobince

+0

C# 또는 다른 언어로 인코딩 된 문자열에 대해 작동합니까? – Rella

0

다른 사람이 제안한 것처럼 유니 코드 HTML 엔터티로 변환하십시오. 플래시 "탈출 (문자열)"에 의해 생성이 내가 사용하는 정규식,

function escapePercentU($s) { 
    $s = preg_replace("/%u([A-Fa-f0-9]{4})/", "&#x$1;", $s); 
    return html_entity_decode($s, ENT_COMPAT, 'utf-8'); 
} 
관련 문제