2014-12-11 2 views
2

PHP의 GET 및 POST 요청에서 문자 세트가 다른 문제가 있습니다. 상황은 다음과 같습니다.PHP : POST 및 GET의 문자 집합이 다릅니다

노르웨이어 문자열이 있습니다. 이 문자열에는 노르웨이어 문자가 포함될 수 있습니다 (예 : "Ensjøsvingen"). 이 문자열을 GET 매개 변수를 통해 전달한 다음 가져오고 계산하게하면 strlen이 13 [올바른 값]이라고보고합니다. 내가의 printf를 사용하여 16 진수하는 문자열을 변환 할 때 내가 POST-있었던 파라미터를 통해이 문자열을 전달하면, 그것을 가져 그것은 계산하자, 그것은 17

의 나 strlen를보고,이 나오는 것입니다 :

GET : 45 6e 73 6a c3 b8 73 76 69 6e 67 65 6e

POST : 45 6e 73 6a 26 23 32 34 38 3b 73 76 69 6e 67 65 6e

물론, POST가 더 길다. 내 생각은 그것이 charset 이었기 때문에 PHP는 문자열에 어떤 문자셋이 있는지 알려주고 PHP는 GET-String이 UTF-8이고 POST-String이 ASCII (UTF-8의 하위 집합 임)). iconv를 사용하여 ASCII를 UTF-8로 변환하면 strlen에서 아무 것도 변경되지 않습니다.

문제는 그 문자열을 사용하여 나중의 사용을 위해 SHA1 해시를 생성한다는 것입니다 (콜리 전을 피해야하는 곳에서는 아무 것도 중요하지 않으므로 SHA1은 완전히 괜찮습니다). 그래서 mb _ * - 함수를 사용하여 정확한 결과를 얻을 수 없습니다 문자열이 전달 된 것과 관계없이 동일한 해시.

어떻게이 문제를 해결할 수 있습니까?

+0

양식에 문자 세트를 지정 하시겠습니까? 즉'

' – FuzzyTree

+0

@FuzzyTree 네, 그렇게했습니다. 불행히도, 이것은 아무 것도 바뀌지 않습니다. –

+0

약간의 해결 방법이지만 html_entity_decode는 다양한 형식의 여러 특수 문자를 처리하여 적절한 HTML 엔터티로 변경합니다. 해당 함수를 통해 두 문자열을 모두 보내면 동일한 결과가 나타 납니까? 그것은 & oslash를 사용하여 둘 다 변환해야합니다; – kainaw

답변

1

이전에 크게 도움이 된 몇 가지 정보가 포함되어 있기 때문에 아래에 원래 답변을 남깁니다. 그러나 제공되는 출력을 언 헥싱 한 후에, 두 문자열의 차이점은 POST에서 나온 문자열이 HTML 엔티티를 사용하여 인코딩된다는 것입니다. 두 문자열은 모두 동등하지만 필요한 결과를 얻으려면 html_entity_decode (인코딩 매개 변수에서 UTF-8 제공)를 사용해야합니다. 아래에서 설명하는 이유 때문에 직접 바이트 비교가 실패 할 수 있기 때문에 이전에 대한 답을 남겨 두었습니다.


PHP가 브라우저에서 입력을 허용하면 문자 인코딩과 관련하여 아무 작업도 수행하지 않습니다. 그것은 말하자면, GET 매개 변수를 위해, 당신을 위해 그들을 un-urlencode하려고 시도합니다. 브라우저가 UTF-8 문자열을 인코딩하는 방법에 따라 많은 문자가 UTF-8에서 둘 이상의 인코딩을 갖습니다. 완전한 문자와 기본 문자를 사용하고 같은 발음을하기 위해 발음 구별 기호 또는 다른 기호를 결합하는 여러 다른 인코딩을위한 하나의 인코딩이 있습니다. Utf-8 인식 언어의 경우, 문자에 대한 모든 인코딩은 동등한 것으로 취급되기 때문에 문제가되지 않습니다. PHP는 문자 인코딩을 시도하지 않기 때문에 동일한 두 가지 정규화 끈.

많은 문제는 intl extension's Normalizer을 사용하여 해결되었으므로 한 가지 일반적인 형식이나 다른 바이트 직접 비교 (UTF-8 인식 문자 비교가 아닌)가 동일한 결과를 얻을 수있었습니다. . 모든 UTF-8 문자열을 기억하는 것이 중요합니다. strlen()과 mb_string 확장자가 아닌 다른 PHP 문자열 함수는 오버로드를 켜지 않는 한 멀티 바이트 인식이 아니므로 UTF-8로 작업 할 때 문자 수보다는 바이트 수를 제공합니다.

긴 이야기를 짧게하려면 UTF-8로 작업 할 때 mb_string 함수를 사용하고 UTF-8 문자열 정규화를 조사하여 바이트 비교가 동등한 문자인지 확인해야합니다. UTF-8의 다중 인코딩

+0

나는이 답을 올바른 것으로 표시했다. UTF-8과 함께 html_entity_decode를 사용하면이 성가신 문제를 해결할 수 있습니다. 고마워요! –

+0

고맙습니다. 문제가 해결되어서 다행입니다. 나는 처음에는 unhexed해야 했으므로 나는 마지막에 성가신 추가 정보를 가지고 있지 않을 것이다. –