2012-08-24 2 views
7

현재 블리자드 커뮤니티 API에서 JSON 데이터를 가져 와서 PHP로 구문 분석하는 응용 프로그램을 작성 중입니다. 이름에 특별한 인물이 등장 할 때까지 모든 것이 잘 작동합니다.특수 문자 및 URL 재 작성

문자 데이터를 가져 오려면 문자 이름과 문자가 있다는 것을 알아야합니다.

URL을 통해 문자 페이지로 전달되는 이름과 영역이 있으며 그 정보를 사용하여 문자 데이터를 가져옵니다. 이 시점에서

내 URL이 너무과 같다 :

http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu 

이 시점에서 유효한하지 않기 때문에 내가 내 오류 페이지로 다시 지시하세요 악센트 문자에 대한 데이터를 가져하려고하면 캐릭터.

URL 재 작성을 시작한 후에야 내 문제를 발견했습니다. 나는 라인을 따라 어딘가에있는 특수 문자로 인해 정말로 엉뚱한 문자가 대체되기 때문에 나의 오류 페이지로 방향이 바뀌고있다. 나의 새로운 재 작성 URL을

추적 작동 : 그러나

http://localhost/guildtree/argent-dawn/ankzu 

, 오류 메시지에 이름 결과에 특수 문자와 문자. 다음과 같은 오류 메시지

http://localhost/guildtree/argent-dawn/notúk 

결과 :

. "찾을 수 없음

요청 된 URL/guildtree/은빛 새벽/notúk이 서버에서 찾을 수 없습니다"

그것은 이유는 왜 ú가 ú으로 나타나는 것이 나의 이해는 당신이 ú가 ú 대체되고 볼 수 있지만 나는 URL을 복사하여 붙여 넣을 때 유 %의 C3의 %의 BA로 나타납니다으로 왜냐하면 2 바이트 유니 코드 ú가 2 바이트의 ASCII 문자로 쪼개어 져서 º가 표시되기 때문입니다.

나는 보장 한 모든 내 페이지하여 헤더에 다음이 있습니다

내 어플은 제대로 표시하는 특수 문자를 필요 제대로 작동하는, 그래서 실제로 표시 ú 필요 위해서는
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

ú로 표시되지는 않지만 실제로는 º 또는 % C3 % BA입니다.

$charName = $_GET['name']; 

는 $ CHARNAME 제대로 특수 문자를 표시 할 인코딩 가능 :

문자 이름은 단순히으로 URL에서 가져온되고있다?

나는 Google에서 생각하고 검색 한 모든 것을 시도했지만 아무 것도 효과가 없었습니다.

URL 재 작성을 사용하고 있기 때문에 다시 쓰기 규칙을 사용하면 이러한 특수 문자를 허용 할 수 있습니까?여기

내 현재의 재 작성 규칙입니다 :
RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC] 

내가 ([A-ZA-Z] +)는 모든 특수 문자를 허용하지 않는 것을 알고 있어요, 나는 현재를 얻기에 노력하고있다

특수 문자가 올바르게 표시됩니다. ([a-zA-Z \ º] +)를 사용하면 표시해야 할 페이지가 표시되고 작동합니다. 규칙에 \ º를 추가하는 것은 매우 빈약 한 방법으로 보이며 악센트 부호가있는 문자에 해당 문자를 사용하는 동안 항상 작동하지는 않습니다.

도움을 주시면 감사하겠습니다. 더 자세한 정보가 필요하면 요청하십시오.

편집 : 아래로 내 재 작성 규칙을 변경하면

정보가 잘 당겨 할 수 있습니다,하지만 내 CSS에 대한 리디렉션 루프를 만듭니다. 몇 가지 간단한 테스트를 통해

:

RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$  characters.php?realm=$1&name=$2 [NC] 

는 예를 들어 내 CSS는

http://localhost/guildtree/css/error 

대신

http://localhost/guildtree/css/style2.css 

업데이트로 리디렉션되고

$charName = $_GET['name']; 
$charNameTEST = utf8_encode($charName); 

는 변화를 만들 것,하지만 난 내 페이지에이를 적용 할 때 여전히 말까지 제공 :

"

해당/guildtree/은빛 새벽/notúk이 서버에서 URL을 찾을 수 없습니다 요청 된을 찾을 수 없음 . "

JSON 데이터에 악센트 부호가있는 문자가있을 때 JSON 데이터를 완벽하게 파싱 할 수 있기 때문에 주요 문제는 URL 리디렉션과 관련이 있다고 생각합니다. 나는 브라우저 막대에 guildtree/argent-dawn/notúk에 있다는 것을 왜 계속 보여 주 었는지 모르겠지만/guildtree/argent-dawn/notúk를 끌어 올리려고 노력하고있다.

답변

3

ú URL에 유효한 문자가 아닙니다.

사용자 이름을 링크 할 때마다 URL 인코딩해야합니다. 를 가리 키도록

따라서 올바른 URL은 다음과 같습니다

http://localhost/guildtree/argent-dawn/not%C3%BAk 

는 당신은 PHP에 인쇄해야합니다

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>; 
+0

누군가가 URL을 직접 입력하면 어떨까요? – akari

+0

사용자 이름을 ASCII로 간주 할 수도 있습니다. example.com/guildtree/argent-dawn/not % C3 % BAk' 대신'example.com/guildtree/argent-dawn/notuk /'를 사용하십시오. 사용자가 쉽게 찾을 수 있습니다. –

+0

example.com/guildtree/argent-dawn/notuk and example.com/guildtree/argent-dawn/notúk 두 개의 완전히 다른 데이터 집합을 가져 오지만 문자 이름은 정확해야합니다. – akari

2

내가 this question 답이있을 수 있습니다 생각합니다. 나는 하지이 나 자신을 시도,하지만 내가 무엇을 볼 수에서, 당신은 당신의 RewriteRule의를 다시 작성해야 할 것 :

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC,B] 

B 플래그는 특수 문자는 URL 이스케이프되어 있는지 확인합니다, 그래서 $ 2에 이름으로 표시된 값은 인코딩 된 퍼센트입니다. 리디렉션을 수행하지 않으므로 원래의 유니 코드 문자는 URL에 표시되는 문자 여야합니다.

유니 코드 문자와 일치하는지 확인하기 위해 정규식을 일부 변경해야합니다. 나는 그 사람들이 무엇인지 확신 할 수 없다.

unicode characters work in URLs over here에 대한 자세한 설명이 있습니다.

+0

나는 그것을 묶었지만 내부 서버 오류가 발생하고 있습니다. 편집 : 오타가 있었지만 내부 오류는 없었지만 아직 작동하지 않습니다. – akari

2

제대로 작동하려면 두 가지 작업을 수행해야합니다. (. *)

첫째과 같이

AddDefaultCharset On 
AddDefaultCharset UTF-8 
AddCharset UTF-8 .tpl 
AddCharset UTF-8 .js 
AddCharset UTF-8 .css 
AddCharset UTF-8 .php 

가 두 번째로 특수 문자를 허용 할 필요가 귀하의 재 작성 규칙의 일부를 변경하려면 htaccess로이 추가 :

RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$  characters.php?realm=$1&name=$2  [NC] 

이 의지 다른 페이지에 대해 일부 리디렉션 루프가 발생하지만 현재 수정 중입니다.