푸니코드
PunycodePunycode는 인터넷 호스트 이름에 사용되는 제한된 ASCII 문자 하위 집합을 가진 유니코드를 나타낸다. Punycode를 사용하면 유니코드 문자를 포함하는 호스트 이름이 문자, 숫자, 하이픈으로 구성된 ASCII 하위 집합으로 변환되는데, 이를 문자-자리-하이픈(LDH) 하위 집합이라고 한다. 예를 들어 뮌헨(뮌헨의 독일식 이름)은 뮌헨-3야로 부호화되어 있다.
DNS(Domain Name System)는 기술적으로 도메인 이름 레이블에 있는 임의의 8진수 순서를 지원하는 반면, DNS 표준은 호스트 이름에 일반적으로 사용되는 ASCII의 LDH 부분집합 사용을 권장하며, DNS 도메인 이름 간의 문자열 비교는 대/소문자를 구분하지 않아야 한다고 요구한다. 푸니코드 구문은 국제화된 도메인 이름(IDNA)과 같은 유니코드 문자가 포함된 문자열을 DNS가 선호하는 ASCII의 LDH 하위 집합에 인코딩하는 방식이다. IETF 의견 요청 3492에 명시되어 있다.[1]
인코딩 절차
RFC 3492에 명시된 바와 같이, "Punycode는 Bootstring이라는 보다 일반적인 알고리즘의 한 예로서, 'Basic' 코드 포인트의 작은 집합으로 구성된 문자열이 더 큰 집합에서 추출된 코드 포인트의 문자열을 고유하게 나타낼 수 있도록 한다." Punycode는 유니코드 텍스트의 특성과 일치하도록 일반 부트스트링 알고리즘에 대한 파라미터를 정의한다. 이 절은 "bcher-kva"라는 레이블로 번역된 문자열 "bucher" (Bücher는 책의 경우 독일어)의 예를 사용하여 Punycode 인코딩 절차를 설명한다.
ASCII 문자 분리
첫째, 문자열의 모든 ASCII 문자는 입력에서 출력으로 복사되어 다른 문자를 건너뛰게 된다. 예를 들어, "bucher"는 "bcher"에 복사된다. 문자가 복사된 경우, 즉 입력에 ASCII 문자, 즉 ASCII 문자가 하나 이상 있는 경우II 하이픈은 다음 출력에 추가된다(예: "bucher" → "bcher-" 그러나 "u" → ""). ASC 이후II 하이픈은 ASCII 문자로, 하이픈 자체는 이 추가 하이픈 이전에 출력에 나타날 수 있다. 그러나 추가 하이픈은 출력을 읽을 때 모호함을 유발하지 않는다. 인코딩 프로세스의 이후 부분은 다른 ASC를 도입할 수 없기 때문이다.II 하이픈, 하나 이상의 ASC가 있는 경우출력에서 II 하이픈, 마지막 하이픈은 항상 ASCII 문자의 끝을 나타낸다.
비 ASC의 인코딩코드 번호로 II 문자 삽입
인코딩 프로세스의 다음 부분은 먼저 디코더에 대한 이해를 필요로 하는데, 디코더는 두 가지 상태 변수 i와 n을 가진 유한 상태 기계다. i는 (시작에서 잠재적 삽입을 나타냄) 0에서 확장된 문자열의 현재 길이(끝에서 잠재적 삽입을 나타냄)에 이르는 문자열의 인덱스다.
i는 0에서 시작하고 n은 128에서 시작한다(첫 번째 비 ASCII 코드 포인트). 상태 진행은 단조로운 기능이다. 상태 변경은 i를 증가시키거나, i가 최대일 경우 i를 0으로 재설정하고 n을 1씩 증가시킨 다음, 다음 상태 변경에서 i를 증가시키는 것으로 되돌아간다. 각 상태 변경 시 n으로 표시된 코드 포인트를 삽입하거나 삽입하지 않는다.
인코더에서 생성된 코드 번호는 삽입하기 전에 건너뛸 수 있는 가능성을 나타낸다. 현재 문자열 "bcher"에 문자를 삽입할 수 있는 장소는 6개(첫 번째 문자 앞과 마지막 문자 뒤에 포함)이다. 마지막으로 검토된 코드 포인트(127 = 0x7F, ASCII의 끝)와 "u"(코드 포인트 252 = 0xFC, 유니코드의 라틴-1 부록 참조) 사이에는 124개의 코드 포인트가 있다. 또한 건너뛰어야 하는 'u'를 삽입하는 위치('b' 앞의 위치 0)도 있다. 그렇기 때문에 디코더에게 필요한 삽입물에 도달하기 전에 총 (6 × 124) + 1 = 745개의 삽입 가능한 것을 건너뛰도록 지시할 필요가 있다. 일단 캐릭터가 삽입되면, 이제 다른 캐릭터를 삽입할 수 있는 7개의 장소가 있다.
코드 번호를 ASCII 시퀀스로 다시 인코딩
Punycode는 이러한 값을 나타내기 위해 일반화된 가변 길이 정수를 사용한다. 예를 들어, 코드 번호 745를 나타내기 위해 "kva"를 사용하는 방법은 다음과 같다.
별도의 구분자 없이 가변 길이 코드를 허용하는 리틀 엔디안 순서를 가진 숫자 시스템이 사용된다. 임계값보다 낮은 숫자는 가장 유의한 숫자임을 표시하므로 숫자가 끝난다. 임계값은 효율을 높이기 위해 숫자의 위치와 이전 삽입에 따라 달라진다. 이에 상응하여 숫자의 무게는 다양하다.
이 경우 36개의 기호를 가진 숫자 체계를 사용하며, 대소문자를 구분하지 않는 'a' ~ 'z'는 소수점 0 ~ 25, '0' ~ '9'는 소수점 26 ~ 35와 같다. 따라서 "kva"는 십진수 문자열 "10 21 0"에 해당한다.
이 기호 문자열을 해독하려면 일련의 임계값(이 경우 1, 1, 26)이 필요하다. 우리는 가장 작은 숫자의 무게가 항상 1이라는 것을 보여줄 수 있다. 즉, 첫 번째 기호는 단위 위치 값이다; 1의 가중치를 가진 'k'(=10)는 10이다. 이후 다음 자릿수의 무게는 첫 번째 임계값에 따라 달라진다. 두 번째 기호는 위치 값 36에서 이전 임계값 35를 뺀 값이다. 따라서 앞의 두 기호 'k'(=10)와 'v'(=21)의 합은 10×1 + 21×35이다. 두 번째 기호는 임계값인 1보다 작지 않기 때문에 앞으로 더 많은 것이 있다. 그러나 이 예에서 세 번째 기호는 'a'(=0)이므로 무게 계산을 무시할 수도 있다. 따라서 "kva"는 십진수(10 × 1) + (21 × 35) = 745를 나타낸다.
(n+1)번째 자릿수의 무게가 이전 1회(36번째 자릿수 임계값)의 무게임을 유도로 쉽게 알 수 있다.
임계값 자체는 연속 인코딩 문자를 1에서 26까지 포함하는 알고리즘에 의해 결정된다. 즉, 인코딩의 마지막 문자는 항상 알파벳이 된다. 그런 다음 이 케이스를 사용하여 문자열의 원래 케이스에 대한 정보를 제공할 수 있다.
'뷔처'에 두 번째 특수문자를 삽입하는 경우, 첫 번째 가능성은 코드 'bcher-kvaaa'를 가진 '뷔처', 코드 'bcher-kvab'을 가진 두 번째 '뷔처' 등이다. 코드 "bcher-kbea"를 가진 "bucher-kbea"를 가진 "bucher-kvaf"를 가진 "bucher"를 시작으로 u에 따르는 등장인물은 코드 "bcher-kvab"을 코드 "bcher-jvab"과 다르다.
인코딩 및 디코딩 알고리즘을 단순화하기 위해 일부 인코딩된 값이 허용되지 않는 유니코드 값을 인코딩하는 것을 방지하려는 시도가 없었다. 단, 디코딩하는 동안 이러한 값을 확인하고 탐지해야 한다.
Punycode는 모든 스크립트에 걸쳐 작동하도록 설계되었으며, 작동하면서 문자열 내의 문자 집합 범위에 적응하도록 시도함으로써 자가 최적화되도록 설계되었다. 문자열이 0자 이상의 ASCII 문자와 더불어 다른 하나의 스크립트 시스템에서만 추가되는 문자로 구성된 경우에 최적화되지만 임의의 유니코드 문자열을 처리할 것이다. DNS 사용의 경우, 도메인 이름 문자열이 포니코딩되기 전에 공식 등록 언어 테이블에 대해 필터링된 Nameprep 및 (최고 수준 도메인의 경우)를 사용하여 정규화된 것으로 간주되며, DNS 프로토콜은 출력 Punycode 문자열의 허용 가능한 길이에 대한 제한을 설정한다는 점에 유의하십시오.
예
다음 표는 다양한 입력 유형에 대한 Punycode 인코딩의 예를 보여준다.[2]
입력 | 입력 푸니코드 | 입력 설명 |
---|---|---|
빈 문자열. | ||
a | a- | ASCII 문자만, 하나, 소문자. |
A | A- | ASCII 문자만, 하나, 대문자. |
3 | 3- | ASCII 문자만, 하나, 숫자. |
- | -- | ASCII 문자만, 하나, 하이픈. |
-- | --- | ASCII 문자만, 하이픈 두 개. |
런던 | 런던- | ASCII 문자만, 둘 이상, 하이픈 없음. |
로이드-앳킨슨 | 로이드-앳킨슨- | ASCII 문자만, 하이픈 하나. |
이것은 공간이 있다. | 여기엔 공간이 있어 | ASCII 문자만, 공백 포함. |
-> $1.00 <- | -> $1.00 <-- | ASCII 문자만, 혼합 기호. |
а | 80a | ASCII 문자 없음, 키릴 문자 하나. |
ü | tda | ASCII 문자 없음, 라틴-1 보충 문자 1개 |
α | mxa | ASCII 문자 없음, 그리스 문자 하나. |
例 | fsq | ASCII 문자 없음, CJK 문자 1개. |
😉 | n28h | ASCII 문자 없음, 이모지 문자 1개. |
αβγ | mxacd. | ASCII 문자 없음, 둘 이상의 문자. |
뮌헨 | 음첸-3야 | 혼합 문자열, ASCII 문자가 아닌 문자 1개. |
음첸-3야 | 음첸-3야- | "뮌헨"의 이중 인코딩 Punycode. |
뮌헨-오스트 | 음첸-오스트-9db | ASCII가 아닌 한 문자와 하이픈이 있는 혼합 문자열. |
반호프 뮌헨-오스트 | 반호프 뮌헨-오스트우6b | 혼합 문자열, 공백 하나, 하이픈 하나 및 ASCII가 아닌 문자 하나. |
abæcdoef. | abcdef-qua4k | 혼합 문자열, ASC가 아닌 두 개II 문자. |
правда | 80aafi6cg | 러시아어, ASCII가 없는 경우. |
ยจฆฟคฏข | 22cdfh1b8fsa | ASCII가 없는 태국어. |
도메인 | hq1bm8jm9l | 한국어, ASCII가 없는 경우. |
ドメイン名例 | eckwd4c7cu47r2wf | 일본어, ASCII가 없는 경우. |
MajiでKoiする5秒前 | 마지코이5-783gue6qz075azm5e | ASCII가 있는 일본어. |
「뷔처」 | bcher-kva8445foa | 혼합 비 ASCII 스크립트(라틴-1 보충판 및 CJK). |
국제화된 도메인 이름
하이픈을 포함하는 비국제 도메인 이름이 실수로 Punycode로 해석되는 것을 방지하기 위해, 국제 도메인 이름 Punycode 시퀀스에는 소위 ASCII 호환 인코딩(ACE) 접두사 "xn--"가 앞에 붙는다.[3] 따라서 도메인 이름 "bücher.tld"는 ASCII로 "xn--bcher-kva.tld"로 표현될 것이다.
참고 항목
참조
- ^ RFC 3492, Punycode: 응용프로그램에서 국제화된 도메인 이름을 위한 유니코드의 부트스트링 인코딩, A. 코스텔로, 인터넷 소사이어티 (2003년 3월)
- ^ 이 표의 Punycode는 Python 프로그래밍 언어 버전 3.8(s.encode("punycode")의 내장된 코덱 "punycode"를 사용하여 만들어졌다. 대화 페이지를 참조하십시오.
- ^ Internet Assigned Numbers Authority (2003-02-14). "Completion of IANA Selection of IDNA Prefix". www.atm.tut.fi. Archived from the original on 2010-04-27. Retrieved 2017-09-22.