Skip to main content

매개변수 퍼센트 인코딩

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, 2진수로 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