UTF-8: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
 
(사용자 2명의 중간 판 2개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''UTF-8'''은 [[유니코드]] [[문자 인코딩]]의 하나이다. [[ASCII]] 문자는 1바이트로 표현하며, 기타 문자는 2~4바이트로 표현한다. 대부분의 [[리눅스 배포판]]과 [[macOS]]에서 표준 인코딩으로 채택되어 사용되고 있으며, [[웹]]에서도 많이 쓰인다. 
'''UTF-8'''은 [[유니코드]] [[문자 인코딩]]의 대표적 표준이다. 명칭은 ''Unicode Transformation Format – 8-bit'' 또는 ''Universal Coded Character Set Transformation Format – 8-bit''의 약자이다.


대부분의 CJKV 문자([[한글]]·[[한자]]·[[히라가나]]·[[가타카나]] 등)는 3바이트 영역에 들어간다.
[[ASCII]] 문자는 1바이트로 표현하며, 기타 문자는 2~4바이트로 표현한다. 대부분의 [[리눅스 배포판]]과 [[macOS]]에서 표준 인코딩으로 채택되어 사용되고 있으며, [[웹]]에서도 많이 쓰인다. 대부분의 CJKV 문자([[한글]]·[[한자]]·[[히라가나]]·[[가타카나]] 등)는 3바이트 영역에 들어간다.


UTF-8은 ASCII를 사용하는 프로그램에서도 큰 오작동이 일어날 일이 없다는 장점이 있기 때문에, 애초에 ASCII를 위해 디자인된 [[유닉스 계열]] [[운영 체제]]에서는 UTF-8을 권장한다. [[Microsoft Windows]]는 [[UTF-16]]을 사용한다.
UTF-8은 ASCII를 사용하는 프로그램에서도 큰 오작동이 일어날 일이 없다는 장점이 있기 때문에, 애초에 ASCII를 위해 디자인된 [[유닉스 계열]] [[운영 체제]]에서는 UTF-8을 권장한다. [[Microsoft Windows]]는 [[UTF-16]]을 사용한다.
19번째 줄: 19번째 줄:
|}
|}


예를 들어 €(U+20AC, 유로 기호)는 다음과 같이 인코딩된다.
먼저 ASCII 영역의 문자는 첫 비트를 0으로 둬서 1바이트로 끝남을 표시한다. 그 외의 문자는 모든 첫 비트가 1이다.
 
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 인코딩을 기준으로 나타낸다. 한국어 위키와 같이 한글이 들어가는 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 표현이다.
가령 본 문서의 "리브레 위키"로 가는 링크인 <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으로 출력한다.  


{{프로그래밍}}
{{프로그래밍}}
[[분류:문자 코드]]
[[분류:유니코드]]
[[분류:표준]]
[[분류:표준]]
{{각주}}
{{각주}}

2023년 7월 23일 (일) 15:43 기준 최신판

UTF-8유니코드 문자 인코딩의 대표적 표준이다. 명칭은 Unicode Transformation Format – 8-bit 또는 Universal Coded Character Set Transformation Format – 8-bit의 약자이다.

ASCII 문자는 1바이트로 표현하며, 기타 문자는 2~4바이트로 표현한다. 대부분의 리눅스 배포판macOS에서 표준 인코딩으로 채택되어 사용되고 있으며, 에서도 많이 쓰인다. 대부분의 CJKV 문자(한글·한자·히라가나·가타카나 등)는 3바이트 영역에 들어간다.

UTF-8은 ASCII를 사용하는 프로그램에서도 큰 오작동이 일어날 일이 없다는 장점이 있기 때문에, 애초에 ASCII를 위해 디자인된 유닉스 계열 운영 체제에서는 UTF-8을 권장한다. Microsoft WindowsUTF-16을 사용한다.

구조[편집 | 원본 편집]

첫 번째
코드 포인트
마지막
코드 포인트
첫째 바이트 둘째 바이트 셋째 바이트 넷째 바이트 시작
U+0000 U+007F 0xxxxxxx 00 7F
U+0080 U+07FF 110xxxxx 10xxxxxx C2 80 DF BF
U+0800 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx E0 A0 80 EF BF BF
U+10000 U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx F0 90 80 80 F4 8F BF BF

먼저 ASCII 영역의 문자는 첫 비트를 0으로 둬서 1바이트로 끝남을 표시한다. 그 외의 문자는 모든 첫 비트가 1이다.

ASCII 외 문자는 첫째 바이트의 처음 연속한 1의 개수에 따라 몇 바이트로 인코딩할 지를 표시하고, 나머지 바이트는 앞에 10을 붙여서 뒤따르는 바이트임을 나타낸다.

하나의 문자가 여러 가지 방법으로 인코딩될 수 있으나, 올바른 UTF-8 표현은 가장 짧은 것 하나뿐이다. 예를 들어 U+0000은 00, C0 80, D0 80 80, F0 80 80 80과 같이 여러 가지 방법으로 인코딩될 수 있지만, 이 중에서 가장 짧은 00 하나만이 올바른 UTF-8 표현이다.

4바이트 인코딩의 경우, 21비트를 담고 있으므로 이론상으로는 U+1FFFFF까지 표현할 수 있다. 다만 유니코드의 범위가 U+10FFFF까지이기에 이후 범위는 쓰지 않는다.

인코딩 예[편집 | 원본 편집]

1바이트 인코딩
L(U+004C)
  • ASCII 문자이므로 유니코드 값 그대로 01001100으로 나타내며, 16진수로 4C가 된다.
2바이트 인코딩
λ(U+03BB, 그리스 문자 람다 소문자)
  • U+0080과 U+07FF 사이에 있으므로 2바이트로 표현된다.
  • 2진수 값을 5비트와 6비트로 쪼갠다. 00000011 1011101101110 111011
  • 2바이트 패턴인 110xxxxx 10xxxxxx에 넣으면 11001110 10111011이다.
  • 따라서 λ는 UTF-8에서 CE BB로 인코딩된다.
3바이트 인코딩
€(U+20AC, 유로 기호)
  • U+0800과 U+FFFF 사이에 있으므로 3바이트로 표현된다.
  • 0x20AC는 2진수로 0010 0000 1010 1100로 표현된다. 맨 앞에 0 두 개가 추가된 이유는 3바이트 표현은 정확히 16비트를 필요로 하기 때문이다.
  • 이를 1110xxxx 10xxxxxx 10xxxxxx이라는 패턴에 그대로 집어넣는다. 그러면 11100010 10000010 10101100이 된다.
  • 따라서 €는 UTF-8에서 E2 82 AC로 표현된다.
4바이트 인코딩
🙂(U+1F642, 스마일 이모지)
  • U+10000 이후 범위에 속해 있으므로 4바이트로 나타낸다.
  • 2진수 값을 21비트까지 펼치고 3+6+6+6 비트로 쪼갠다. 1 11110110 01000010000 011111 011001 000010
  • 위 표에 써진 패턴을 적용하면 11110000 10011111 10011001 10000010
  • 따라서 해당 이모지의 인코딩 결과는 F0 9F 99 82이다.

URL 인코딩[편집 | 원본 편집]

웹페이지 주소에서 % 기호가 연속으로 붙어 있다면 이는 퍼센트 인코딩이 적용된 것인데, 이때 문자열은 UTF-8 인코딩을 기준으로 나타낸다. 한국어 위키와 같이 한글이 들어가는 URL을 쓴다면 이 형태를 많이 볼 수 있다.

가령 본 문서의 "리브레 위키"로 가는 링크인 https://librewiki.net/wiki/리브레_위키를 퍼센트 인코딩으로 나타낼 때, 위 문단에서 소개한 인코딩 방식으로 출력한다. 이때 UTF-8 인코딩 결과를 각 바이트마다 % 기호를 붙여둔다.

'리'(U+B9AC)를 UTF-8로 나타내면 EB A6 AC가 된다. 여기에 각 바이트에다 %를 붙이면 %EB%A6%AC가 된다. 다른 문자들도 마찬가지 방법으로 인코딩을 거쳐 이어붙이면, 주소는 아래와 같이 출력된다.

https://librewiki.net/wiki/%EB%A6%AC%EB%B8%8C%EB%A0%88_%EC%9C%84%ED%82%A4

참고로 공백의 경우 위키백과나 리브레 위키에서는 언더바(_)로 나타내지만 나무위키에서는 공백도 마찬가지로 위 인코딩을 거쳐 %20으로 출력한다.

각주