메인 콘텐츠로 건너뛰기

퍼센트 인코딩 매개변수

X API의 일부, 특히 OAuth 서명과 관련된 부분에서는 문자열을 RFC 3986, Section 2.1에 따라 인코딩해야 합니다. 많은 URL 인코딩 알고리즘 구현이 RFC 3986과 완전히 호환되지 않기 때문에 잘못된 인코딩이 OAuth 서명 오류의 주요 원인이 됩니다. 이러한 이유로 사용해야 할 정확한 서명 알고리즘을 이 페이지에서 다룹니다. 이 페이지는 RFC 3986, Section 2.1에 설명된 URL 인코딩 절차를 다룹니다. 이 문서와 모호하거나 충돌하는 부분이 있을 경우 해당 명세를 참조하시기 바랍니다.  

문자열 인코딩

다음 알고리즘은 문자열 SRC의 값을 바이트 단위로 복사하여 문자열 DST로 인코딩한다고 가정합니다. 1단계: SRC에 읽지 않은 바이트가 있는 동안 SRC에서 다음 바이트(8비트)를 읽습니다. 일반적으로 이는 문자로 간주되지만, 하나의 문자가 여러 바이트일 수 있는 인코딩(예: UTF-8)에서는 첫 번째 바이트만 읽습니다. 2단계: 읽은 바이트가 다음 ASCII 등가 목록 중 어느 것과 일치하는지 확인합니다. 아래 표는 가독성을 위해 여러 행으로 나누었지만, 특정 행이 아니라 읽은 바이트가 표에 존재하는지만 판단하면 됩니다.
이름ASCII 문자등가 바이트 값
숫자‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
대문자‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’0x41, 0x42, 0x43, 0x44, 0x45,0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58, 0x59, 0x5A
소문자‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’0x61, 0x62, 0x63, 0x64, 0x65,0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78, 0x79, 0x7A
예약 문자‘-‘, ‘.’, ‘_’, ‘~’0x2D, 0x2E, 0x5F, 0x7E
2b단계: 바이트가 위 표에 없다면 계속 진행합니다. 그 외의 값은 모두 인코딩해야 합니다. 2a단계: 바이트가 위 표에 있다면 해당 바이트를 DST에 복사하고 1단계로 돌아갑니다. 위 표에 나열된 문자는 이스케이프할 필요가 없으므로 바이트를 그대로 복사합니다. 3단계: 문자 ‘%’를 DST에 기록합니다. 퍼센트 문자 ‘%’(16진수 0x25, 이진수 00100101)는 다음 두 문자가 인코딩된 바이트를 나타냄을 의미합니다. 4단계: 현재 바이트의 대문자 ASCII로 인코딩된 16진 값을 나타내는 두 문자를 DST에 기록합니다. 다소 혼동될 수 있어 예를 듭니다. 현재 바이트가 0xE6(이진수 11100110)라고 가정합니다. 이는 ‘æ’의 UTF-8 인코딩 값에 해당합니다. 이 값을 인코딩하려면 문자 ‘E’(위 표의 0x45)와 그다음 문자 ‘6’(0x36)을 DST에 기록합니다. 마지막으로 기록된 세 문자는 “%E6”이어야 합니다. A, B, C, D, E 또는 F와 같은 문자를 기록하는 경우 반드시 대문자를 사용해야 합니다. 5단계: 1단계로 돌아갑니다. SRC 전체가 DST로 복사될 때까지 계속합니다.  

예시

다음 예시는 자신의 코드 출력과 비교하는 데 유용합니다. 어떤 차이든 오류로 간주해야 합니다. 공백을 “+” 문자로 인코딩하는 것은 잘못된 인코딩의 예입니다.
원본 문자열인코딩된 문자열
Ladies + GentlemenLadies%20%2B%20Gentlemen
An encoded string!An%20encoded%20string%21
Dogs, Cats & MiceDogs%2C%20Cats%20%26%20Mice
%E2%98%83