답변:
RFC 3986의 2.3 절을 인용하면 :
"URI에서 허용되지만 예약 된 목적이없는 문자는 예약되지 않은 문자라고합니다. 대문자 및 소문자, 십진수, 하이픈, 마침표, 밑줄 및 물결표를 포함합니다."
ALPHA DIGIT "-" / "." / "_" / "~"
RFC 3986에는 이전 문장 부호보다 예약 된 문장 부호가 적습니다. RFC 2396 .
ç
및 õ
?
post-title-with-%C3%A7-and-%C3%B5
만 사용자의 위치 표시 줄에는 여전히로 표시됩니다 post-title-with-ç-and-õ
.
주의해야 할 문자 세트는 reserved 및 unsafe 입니다.
예약 문자는 다음과 같습니다
일반적으로 안전하지 않은 것으로 간주되는 문자 는 다음과 같습니다.
나는 하나 이상을 잊어 버렸을 수 있으며, 이는 칼 V의 대답을 에코합니다. 장기적으로는 서버 및 시스템에서 허용되지 않는 문자를 유지하려고 시도하는 대신 허용되는 문자의 "화이트리스트"를 사용한 다음 문자열을 인코딩하는 것이 좋습니다.
#
이름 속성 또는 id 속성 (sans #
-symbol) 과 일치하는 HTML 요소를 하나 생성하여 특정 페이지의 책갈피에 사용되는 예약 문자 입니다.
~
가 안전 하지 않다는 데 동의하지 않는 것 같습니다 . 확실합니까?
특정 문자 (블랙리스트)를 제거하는 대신 일부 문자 (화이트리스트) 만 유지하는 것이 가장 좋습니다.
제대로 인코딩하는 한 기술적으로 모든 문자를 허용 할 수 있습니다. 그러나 질문의 정신으로 대답하려면 다음 문자 만 허용해야합니다.
다른 모든 것에는 잠재적으로 특별한 의미가 있습니다. 예를 들어 +를 사용할 수 있다고 생각할 수 있지만 공백으로 바꿀 수 있습니다. &는 특히 일부 다시 쓰기 규칙을 사용하는 경우에도 위험합니다.
다른 의견과 마찬가지로 자세한 내용은 표준 및 사양을 확인하십시오.
이것들은 기본적으로 도메인 이름을 제외한 모든 곳에서 안전합니다 (이론 / 사양).
목록에없는 것을 백분율로 인코딩하면 좋습니다.
A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;
특정 URL 구성 요소 내에서 사용될 때만 안전합니다. 주의해서 사용하십시오.
Paths: + & =
Queries: ? /
Fragments: ? / # + & =
URI 사양 (RFC 3986)에 따르면 다른 모든 문자는 백분율로 인코딩되어야합니다. 여기에는 다음이 포함됩니다.
<space> <control-characters> <extended-ascii> <unicode>
% < > [ ] { } | \ ^
최대 호환성이 문제가되는 경우 문자 세트를 AZ az 0-9-_로 제한하십시오.
(파일 이름 확장자에만 마침표 사용).
사양에 따라 유효하더라도 상황에 따라 URL은 여전히 "안전하지 않은"상태 일 수 있습니다. 잘못된 파일 이름 문자가 포함 된 file : /// URL 또는 구분 기호로 사용되지 않는 경우 "?", "="및 "&"를 포함하는 쿼리 구성 요소 이러한 경우를 올바르게 처리하는 것은 일반적으로 스크립트에 따라 다르며 해결 될 수 있지만 명심해야합니다.
params.toString() // "key=730d67"
문자열 화하는 것은 매우 간단합니다 : [...] "(3) PHP Manual, http-build-query : "URL 인코딩 된 쿼리 문자열 생성 [...] 위 예제는 다음과 같이 출력됩니다 : 0=foo&1=bar[...]
"(4) J. Starr, Perishable Press :"웹 페이지를 작성할 때 종종 매개 변수화 된 쿼리 문자열이 필요한 링크를 추가해야합니다. "
보면 RFC3986 -이 URI (Uniform Resource Identifier) : 일반 구문 의 주위에 당신의 질문의 공전 경로 는 URI의 구성 요소입니다.
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose
3.3 절을 인용하면 URI에 유효한 문자 segment
는 다음과 pchar
같습니다.
pchar = 예약되지 않은 / pct 인코딩 / 하위 전송 / ":"/ "@"
다음과 같이 분류됩니다.
ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded
"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
":" / "@"
또는 다른 말로하면 : 당신은에서 모든 (비 제어 -) 문자를 사용할 수 ASCII 테이블 , 제외시켰다 /
, ?
, #
, [
와 ]
.
이 이해는 RFC1738-URL (Uniform Resource Locator)에 의해 뒷받침됩니다 .
-
하고 ;
내 대답과 RFC 명확하게 진술 무슨 그, 안전합니다.
예약되지 않음 = ALPHA / DIGIT / "-"/ "." / "_"/ "~"
당신이 묘사하는 맥락에서, 당신이 실제로하려는 것은 'SEO 슬러그'라고 생각합니다. 이를위한 가장 일반적인 알려진 방법은 다음과 같습니다.
예를 들어, "만화에서 욕설을 표현하기 위해! @ % $ *의 사용법"이라는 제목의 기사는 "usage-represent-swearing-comics"의 슬로건을 얻게됩니다.
비슷한 문제가 있었는데 예쁜 URL을 원했고 URL에 문자, 숫자 및-만 허용해야한다는 결론에 도달했습니다. 괜찮습니다. 그런 다음 멋진 정규 표현식을 작성했으며 모든 UTF8 문자가 .NET의 문자가 아니며 실수임을 인식합니다. 이것은 .NET 정규식 엔진에 대한 알려진 문제인 것 같습니다. 그래서 나는이 해결책을 얻었습니다.
private static string GetTitleForUrlDisplay(string title)
{
if (!string.IsNullOrEmpty(title))
{
return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
}
return string.Empty;
}
/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
string x = m.ToString();
if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
{
return x.ToLower();
}
else
{
return "-";
}
}
ajax / php를 통해 값을 URL로 반환 할 때 내 URL을 안전한 URL로 인코딩하는 것이 매우 유용하다는 것을 알았습니다.
특수 문자 및 URL 인코더를 사용하여 PHP 출력
//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";
//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;
//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.
setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);
누구나 내 작은 코드 추출이 유용하다는 것을 알기를 바랍니다! :)
웹에서 사용하기에 "안전"하도록 URL을 인코딩하는 "URL 인코딩"과 같은 것을 찾고 있다고 생각합니다.
여기에 대한 참조가 있습니다. 특수 문자를 원하지 않으면 URL 인코딩이 필요한 문자 만 제거하십시오.