최신판 |
당신의 편집 |
1번째 줄: |
1번째 줄: |
| '''UTF-8'''은 [[유니코드]] [[문자 인코딩]]의 대표적 표준이다. 명칭은 ''Unicode Transformation Format – 8-bit'' 또는 ''Universal Coded Character Set Transformation Format – 8-bit''의 약자이다. | | '''UTF-8'''은 [[유니코드]] [[문자 인코딩]]의 하나이다. [[ASCII]] 문자는 1바이트로 표현하며, 기타 문자는 2~4바이트로 표현한다. 대부분의 [[리눅스 배포판]]과 [[macOS]]에서 표준 인코딩으로 채택되어 사용되고 있으며, [[웹]]에서도 많이 쓰인다. |
|
| |
|
| [[ASCII]] 문자는 1바이트로 표현하며, 기타 문자는 2~4바이트로 표현한다. 대부분의 [[리눅스 배포판]]과 [[macOS]]에서 표준 인코딩으로 채택되어 사용되고 있으며, [[웹]]에서도 많이 쓰인다. 대부분의 CJKV 문자([[한글]]·[[한자]]·[[히라가나]]·[[가타카나]] 등)는 3바이트 영역에 들어간다.
| | 대부분의 CJKV 문자([[한글]]·[[한자]]·[[히라가나]]·[[가타카나]] 등)는 3바이트 영역에 들어간다. |
|
| |
|
| UTF-8은 ASCII를 사용하는 프로그램에서도 큰 오작동이 일어날 일이 없다는 장점이 있기 때문에, 애초에 ASCII를 위해 디자인된 [[유닉스 계열]] [[운영 체제]]에서는 UTF-8을 권장한다. [[Microsoft Windows]]는 [[UTF-16]]을 사용한다. | | UTF-8은 ASCII를 사용하는 프로그램에서도 큰 오작동이 일어날 일이 없다는 장점이 있기 때문에, 애초에 ASCII를 위해 디자인된 [[유닉스 계열]] [[운영 체제]]에서는 UTF-8을 권장한다. [[Microsoft Windows]]는 [[UTF-16]]을 사용한다. |
19번째 줄: |
19번째 줄: |
| |} | | |} |
|
| |
|
| 먼저 ASCII 영역의 문자는 첫 비트를 0으로 둬서 1바이트로 끝남을 표시한다. 그 외의 문자는 모든 첫 비트가 1이다.
| | 예를 들어 €(U+20AC, 유로 기호)는 다음과 같이 인코딩된다. |
| | |
| ASCII 외 문자는 첫째 바이트의 처음 연속한 1의 개수에 따라 몇 바이트로 인코딩할 지를 표시하고, 나머지 바이트는 앞에 10을 붙여서 뒤따르는 바이트임을 나타낸다.
| |
| | |
| 하나의 문자가 여러 가지 방법으로 인코딩될 수 있으나, 올바른 UTF-8 표현은 가장 짧은 것 하나뿐이다. 예를 들어 U+0000은 <code>00</code>, <code>C0 80</code>, <code>D0 80 80</code>, <code>F0 80 80 80</code>과 같이 여러 가지 방법으로 인코딩될 수 있지만, 이 중에서 가장 짧은 <code>00</code> 하나만이 올바른 UTF-8 표현이다.
| |
| | |
| 4바이트 인코딩의 경우, 21비트를 담고 있으므로 이론상으로는 U+1FFFFF까지 표현할 수 있다. 다만 [[유니코드]]의 범위가 U+10FFFF까지이기에 이후 범위는 쓰지 않는다.
| |
| | |
| == 인코딩 예 ==
| |
| ;1바이트 인코딩: L(U+004C)
| |
| * ASCII 문자이므로 유니코드 값 그대로 <code>01001100</code>으로 나타내며, 16진수로 <code>4C</code>가 된다.
| |
| ;2바이트 인코딩: λ(U+03BB, 그리스 문자 람다 소문자)
| |
| * U+0080과 U+07FF 사이에 있으므로 2바이트로 표현된다.
| |
| * 2진수 값을 5비트와 6비트로 쪼갠다. <code>00000011 10111011</code> → <code>01110 111011</code>
| |
| * 2바이트 패턴인 <code>110xxxxx 10xxxxxx</code>에 넣으면 <code>110<u>01110</u> 10<u>111011</u></code>이다.
| |
| * 따라서 λ는 UTF-8에서 <code>CE BB</code>로 인코딩된다.
| |
| ;3바이트 인코딩: €(U+20AC, 유로 기호)
| |
| * U+0800과 U+FFFF 사이에 있으므로 3바이트로 표현된다. | | * U+0800과 U+FFFF 사이에 있으므로 3바이트로 표현된다. |
| * 0x20AC는 2진수로 <code>0010 0000 1010 1100</code>로 표현된다. 맨 앞에 0 두 개가 추가된 이유는 3바이트 표현은 정확히 16비트를 필요로 하기 때문이다. | | * 0x20AC는 2진수로 <code>0010 0000 1010 1100</code>로 표현된다. 맨 앞에 0 두 개가 추가된 이유는 3바이트 표현은 정확히 16비트를 필요로 하기 때문이다. |
| * 이를 <code>1110xxxx 10xxxxxx 10xxxxxx</code>이라는 패턴에 그대로 집어넣는다. 그러면 <code>1110<u>0010</u> 10<u>000010</u> 10<u>101100</u></code>이 된다. | | * 이를 <code>1110xxxx 10xxxxxx 10xxxxxx</code>이라는 패턴에 그대로 집어넣는다. 그러면 <code>1110<u>0010</u> 10<u>000010</u> 10<u>101100</u></code>이 된다. |
| * 따라서 €는 UTF-8에서 <code>E2 82 AC</code>로 표현된다. | | * 따라서 €는 UTF-8에서 <code>E2 82 AC</code>로 인코딩된다. |
| ;4바이트 인코딩: 🙂(U+1F642, 스마일 이모지)
| |
| * U+10000 이후 범위에 속해 있으므로 4바이트로 나타낸다.
| |
| * 2진수 값을 21비트까지 펼치고 3+6+6+6 비트로 쪼갠다. <code>1 11110110 01000010</code> → <code>000 011111 011001 000010</code>
| |
| * 위 표에 써진 패턴을 적용하면 <code>11110<u>000</u> 10<u>011111</u> 10<u>011001</u> 10<u>000010</u></code>
| |
| * 따라서 해당 이모지의 인코딩 결과는 <code>F0 9F 99 82</code>이다.
| |
|
| |
|
| == URL 인코딩 ==
| | 하나의 문자가 여러 가지 방법으로 인코딩될 수 있으나, 올바른 UTF-8 표현은 가장 짧은 것 하나뿐이다. 예를 들어 U+0000은 <code>00</code>, <code>C0 80</code>, <code>D0 80 80</code>, <code>F0 80 80 80</code>과 같이 여러 가지 방법으로 인코딩될 수 있지만, 이 중에서 가장 짧은 <code>00</code> 하나만이 올바른 UTF-8 표현이다. |
| 웹페이지 주소에서 % 기호가 연속으로 붙어 있다면 이는 퍼센트 인코딩이 적용된 것인데, 이때 문자열은 UTF-8 인코딩을 기준으로 나타낸다. 한국어 위키와 같이 한글이 들어가는 URL을 쓴다면 이 형태를 많이 볼 수 있다.
| |
| | |
| 가령 본 문서의 "리브레 위키"로 가는 링크인 <code><nowiki>https://librewiki.net/wiki/리브레_위키</nowiki></code>를 퍼센트 인코딩으로 나타낼 때, 위 문단에서 소개한 인코딩 방식으로 출력한다. 이때 UTF-8 인코딩 결과를 각 바이트마다 % 기호를 붙여둔다.
| |
| | |
| '리'(U+B9AC)를 UTF-8로 나타내면 <code>EB A6 AC</code>가 된다. 여기에 각 바이트에다 %를 붙이면 <code>%EB%A6%AC</code>가 된다. 다른 문자들도 마찬가지 방법으로 인코딩을 거쳐 이어붙이면, 주소는 아래와 같이 출력된다.
| |
| | |
| <code><nowiki>https://librewiki.net/wiki/%EB%A6%AC%EB%B8%8C%EB%A0%88_%EC%9C%84%ED%82%A4</nowiki></code> | |
| | |
| 참고로 공백의 경우 위키백과나 리브레 위키에서는 언더바(_)로 나타내지만 나무위키에서는 공백도 마찬가지로 위 인코딩을 거쳐 %20으로 출력한다.
| |
|
| |
|
| {{프로그래밍}} | | {{프로그래밍}} |
| [[분류:유니코드]] | | [[분류:문자 코드]] |
| [[분류:표준]] | | [[분류:표준]] |
| {{각주}} | | {{각주}} |