맨위로가기

UTF-8

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

UTF-8은 유니코드 문자를 가변 길이로 인코딩하는 방식이다. 1992년 켄 톰슨과 롭 파이크에 의해 설계되었으며, 1993년 USENIX 컨퍼런스에서 처음 발표되었다. ASCII 문자와의 호환성을 가지며, 웹에서 가장 널리 사용되는 인코딩 방식이다. UTF-8은 1바이트에서 4바이트까지 사용하여 유니코드 코드 포인트를 표현하며, ASCII 문자는 1바이트로, 한글을 포함한 동아시아 문자는 대부분 3바이트로 인코딩된다. UTF-8은 설계상 문자열 검색에 용이하며, 엔디안에 영향을 받지 않는 장점이 있다. 대한민국에서는 대부분의 현대 한글을 문제없이 표현할 수 있지만, 옛한글이나 한자 확장 영역의 일부 문자는 4바이트 영역에 포함되어 일부 시스템에서 처리 문제가 발생할 수 있다.

더 읽어볼만한 페이지

  • 유니코드 변환 형식 - UTF-1
    UTF-1은 유니코드 초기 버전을 인코딩하기 위해 1992년에 설계된 가변 길이 문자 인코딩 방식으로, ASCII 호환성을 유지하고 ISO 2022 및 MIME과의 호환성을 고려했지만, "모듈로 190" 산술을 사용하는 특징과 현대 유니코드 표준과의 차이점을 가진다.
  • 유니코드 변환 형식 - UTF-32
    UTF-32는 유니코드 문자 집합의 각 코드 포인트를 32비트로 표현하는 가변 길이 문자 인코딩 방식이며, 문자열 내 특정 문자를 빠르게 찾는 데 사용되지만 데이터 크기가 크다는 단점이 있다.
  • 유니코드에 관한 - UTF-1
    UTF-1은 유니코드 초기 버전을 인코딩하기 위해 1992년에 설계된 가변 길이 문자 인코딩 방식으로, ASCII 호환성을 유지하고 ISO 2022 및 MIME과의 호환성을 고려했지만, "모듈로 190" 산술을 사용하는 특징과 현대 유니코드 표준과의 차이점을 가진다.
  • 유니코드에 관한 - 유니코드 영역
    유니코드 영역은 문자 및 기호를 논리적으로 그룹화한 블록들의 집합으로, 고유한 이름과 코드 포인트 범위를 가지며, 기본 다국어 평면(BMP)을 포함하여 다양한 평면으로 확장되어 문자 인코딩 등 다양한 분야에서 중요한 역할을 한다.
  • 문자 인코딩 - 유니코드
    유니코드는 세계의 모든 문자를 하나의 컴퓨터 인코딩 표준으로 통합하기 위해 설계되었으며, 유니코드 컨소시엄에 의해 관리되고 UTF-8, UTF-16, UTF-32 등의 부호화 형식을 제공하지만, 일부 문자 표현 문제, 버전 간 비호환성, 레거시 인코딩과의 호환성 문제 등의 과제를 안고 있다.
  • 문자 인코딩 - Shift JIS
    Shift JIS는 JIS X 0201을 기반으로 JIS X 0208을 할당하여 일본어 문자를 인코딩하는 방식으로, 이스케이프 시퀀스 없이 문자 집합을 혼용하여 파일 크기를 절약하고 처리 시간을 단축하며, MS-DOS에서 "MS 한자 코드"로 채택된 후 사실상 표준으로 자리 잡았다.
UTF-8
인코딩 방식
이름UTF-8
표준유니코드 표준
분류유니코드 변환 포맷
EASCII
가변 너비 인코딩
인코딩 대상ISO/IEC 10646 (유니코드)
확장US-ASCII
이전UTF-1

2. 역사

국제 표준화 기구(ISO)는 1989년에 유니버설 멀티바이트 문자 집합 구성을 시작했다. 1992년 7월, X/Open 위원회는 더 나은 인코딩을 찾고 있었다. 유닉스 시스템 연구소의 데이브 프로서는 빠른 구현 특성을 가진 제안을 제출했고, 7비트 ASCII 문자는 "자신"만을 나타내도록 하는 개선 사항을 도입했다.[3] 1992년 8월, 이 제안은 IBM X/Open 대표에 의해 관련 당사자들에게 배포되었다. 벨 연구소의 플랜 9 운영 체제 그룹의 켄 톰슨은 자기 동기화 코드가 되도록 수정하여, 독자가 어디에서든 시작하여 즉시 문자 경계를 감지할 수 있게 하였다. 1992년 9월 2일, 롭 파이크와 켄 톰슨은 뉴저지 식당의 식탁 매트에 UTF-8의 기본 설계를 요약했다.[8] 다음 날, 파이크와 톰슨은 이를 구현하고 플랜 9를 업데이트하여 사용했으며,[8] X/Open에 그들의 성공을 전달했고, X/Open은 이를 FSS-UTF의 사양으로 받아들였다.[6]

UTF-8은 1993년 1월 25일부터 29일까지 샌디에이고에서 열린 USENIX 컨퍼런스에서 처음 공식 발표되었다.[9] 인터넷 기술 연합은 1998년 1월에 미래의 인터넷 표준 작업을 위해 UTF-8을 채택했다.[10] 2003년 11월, UTF-8은 UTF-16 문자 인코딩의 제약에 맞춰 제한되었다.[11]

2010년 이후 1,000만 개의 가장 인기 있는 웹사이트에서 선언된 문자 집합


400px


UTF-8은 2008년부터 월드 와이드 웹에서 가장 흔하게 사용되는 인코딩 방식이 되었다.[23]

3. 구조

UTF-8은 유니코드 문자들을 인코딩하기 위해 만들어진 가변 길이 문자 인코딩 방식이다. 여기서 '가변 길이'란, 문자에 따라 사용하는 바이트 수가 달라진다는 뜻이다.

ASCII와 호환성을 유지하기 위해, ASCII 문자는 1바이트로 표현된다. 그 외의 문자들은 2바이트에서 최대 4바이트까지 사용하여 표현한다.[90][91][92][93] 4바이트 시퀀스에서는 21비트(0x1FFFFF)까지 표현할 수 있지만, 유니코드 범위를 벗어나는 U+10FFFF보다 큰 값은 허용하지 않는다.

인코딩은 최소 바이트 수로 표현해야 한다. 따라서 바이트 수마다 유니코드의 부호 위치 최소값(하한)도 설정되어 있다.

바이트 수유효 비트유니코드2진수 표기16진수 표기
17 비트colspan="2" |0xxx-xxxxcolspan="3" rowspan="3" style="background: silver;" |00..7Fcolspan="3" rowspan="3" style="background: silver;" |
하한U+00000000-000000
상한U+007F0111-11117F
211 비트colspan="2" |110y-yyyx10xx-xxxxcolspan="2" rowspan="3" style="background: silver;" |C2..DF80..BFcolspan="2" rowspan="3" style="background: silver;" |
하한U+00801100-00101000-0000C280
상한U+07FF1101-11111011-1111DFBF
316 비트colspan="2" |1110-yyyy10yx-xxxx10xx-xxxxcolspan="1" rowspan="3" style="background: silver;" |E0..EF80..BF80..BFcolspan="1" rowspan="3" style="background: silver;" |
하한U+08001110-00001010-00001000-0000E0 80*80
상한U+FFFF1110-11111011-11111011-1111EF BF*BF
421 비트colspan="2" |1111-0yyy10yy-xxxx10xx-xxxx10xx-xxxxF0..F480..BF80..BF80..BF
하한U+100001111-00001001-00001000-00001000-0000F0 80*8080
상한U+10FFFF1111-01001000-11111011-11111011-1111F4 BF*BFBF



* 첫 번째 바이트가 E0일 때 두 번째 바이트가 80-9F 범위, 또는 F0일 때 80-8F 범위를 취하는 것은 중복된 인코딩이므로 허용되지 않는다. 첫 번째 바이트가 ED일 때 두 번째 바이트가 A0 이상이 되는 것은 서로게이트 페어를 위한 부호 위치에 해당하며, 또한 F4일 때 90 이상이 되는 것은 유니코드 범위를 벗어나므로, UTF-8에서는 역시 허용되지 않는다.

유니코드의 부호 위치를 2진 표기한 것을 위의 비트 패턴의 x, y에 오른쪽 정렬하여 저장한다(최소 바이트 수로 표현하기 위해 y 부분에는 최소 1회는 1이 나타난다). 인코딩된 바이트 열은 바이트 순서에 관계없이 왼쪽부터 순서대로 출력한다.

1바이트째의 선두에 연속된 비트 "1"의 개수(그 뒤에 비트 "0"이 1개 붙음)로 해당 문자의 바이트 수를 알 수 있다. 또한 2바이트째 이후는 비트 패턴 "10"으로 시작하며, 1바이트째와 2바이트째 이후에서는 값의 범위가 겹치지 않으므로 문자 경계를 확실하게 판정할 수 있다.

7바이트 이상의 문자는 규정되지 않으므로 0xFE, 0xFF는 사용되지 않는다. 이 때문에 바이트 순서 표식(BOM)에 0xFE0xFF를 사용하는 UTF-16이나 UTF-32가 UTF-8과 혼동되는 일은 없다.

UTF-8 인코딩은 다음과 같은 특징을 갖는다.


  • ASCII 문자 코드 텍스트를 처리하는 소프트웨어의 대부분을 그대로 사용할 수 있다.[94]
  • 바이트 스트림 내 임의의 위치에서 해당 문자, 이전 문자 또는 다음 문자의 첫 번째 바이트를 쉽게 판별할 수 있다.
  • 문자열 검색을 단순한 바이트 열 검색으로 수행해도 문자 경계와 다른 곳에서 일치하는 일이 없다.
  • UTF-16 또는 UTF-32와 달리 바이트 단위 입출력을 수행하므로, 바이트 순서의 영향을 받지 않는다.
  • 21비트까지 표현할 수 있으므로 서로게이트 페어를 사용할 필요가 없다.
  • ASCII 문자가 주를 이루는 문서라면, 거의 데이터 크기를 늘리지 않고 유니코드의 이점을 누릴 수 있다.
  • 여러 UTF-8 문자열을 단순한 부호 없는 8비트 정수의 배열로 간주하여 사전순 정렬한 결과는 유니코드 코드 포인트의 사전순 정렬 결과와 동일하다.

3. 1. 인코딩 방식

나머지 바이트들은 10으로 시작함000800-00FFFFxxxxxxxx xxxxxxxx1110xxxx 10xxxxxx 10xxxxxx010000-10FFFF110110ZZ ZZxxxxxx 110111xx xxxxxxxx11110zzz 10zzxxxx 10xxxxxx 10xxxxxxUTF-16 서러게이트 쌍 영역 (ZZZZ = zzzzz - 1).
UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.



예를 들어, 문자 "위"([http://www.unicode.org/charts/PDF/UAC00.pdf U+C704])는 다음과 같이 UTF-8로 인코딩된다.



따라서 첫 128 문자는 1바이트로 표시되고, 그 다음 1920 문자[107]는 2바이트로 표시되며, 나머지 문자들 중 기본 다국어 평면(BMP) 안에 들어 있는 것은 3바이트, 아닌 것은 4바이트로 표시된다.

위의 패턴을 사용하면 더 큰 코드 포인트를 표시할 수도 있다. 원래 UTF-8은 6바이트를 사용해서 U+7FFFFFFF까지의 코드 포인트를 표현할 수 있게 하였으나, 2003년 11월에 발표된 RFC 3629에서는 유니코드에서 실제로 정의하는 U+10FFFF까지의 문자만을 표시할 수 있도록 제한하였다. 따라서 이전까지는 UTF-8에서 나타날 수 없는 바이트가 0xFE0xFF 뿐이었지만, RFC 3629에 따라서 0xC0, 0xC1, 그리고 0xF5부터 0xFF까지의 13개의 바이트가 나타날 수 없게 되었다.

UTF-8은 코드 포인트의 값에 따라 1바이트에서 4바이트까지 코드 포인트를 인코딩한다.

코드 포인트 ↔ UTF-8 변환
첫 번째 코드 포인트마지막 코드 포인트바이트 1바이트 2바이트 3바이트 4
U+0000U+007Fstyle="background: darkgray" colspan=3 |
U+0080U+07FFstyle="background: darkgray" colspan=2 |
U+0800U+FFFFstyle="background: darkgray" |
U+010000U+10FFFF



처음 128개의 코드 포인트(ASCII)는 1바이트가 필요하다. 다음 1,920개의 코드 포인트는 2바이트로 인코딩해야 하며, 이는 거의 모든 라틴 문자의 나머지 부분과 IPA 확장, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자, 시리아 문자, 타나 및 N'Ko 문자와 결합된 분음 부호를 포함한다. 나머지 기본 다국어 평면(BMP)의 61,440개의 코드 포인트를 위해서는 3바이트가 필요하며, 여기에는 대부분의 중국어, 일본어 및 한국어 문자가 포함된다. 유니코드의 평면에 있는 1,048,576개의 코드 포인트를 위해서는 4바이트가 필요하며, 여기에는 이모지 (그림 문자), 덜 일반적인 중국어, 일본어 및 한국어 문자, 다양한 역사적 스크립트 및 수학 기호가 포함된다.

이것은 ''접두사 코드''이며, 코드 포인트를 디코딩하기 위해 코드 포인트의 마지막 바이트를 넘어서 읽을 필요가 없다. Shift-JIS와 같은 많은 이전의 멀티 바이트 텍스트 인코딩과 달리, 이 인코딩은 ''자기 동기화 코드''이므로 짧은 문자열이나 문자를 검색할 수 있으며, 무작위 위치에서 코드 포인트의 시작 부분을 최대 3바이트까지 뒤로 이동하여 찾을 수 있다. 선두 바이트에 대해 선택된 값은 UTF-8 문자열 목록을 정렬하면 UTF-32 문자열을 정렬하는 것과 동일한 순서가 되도록 한다.

다음 차트는 UTF-8로 인코딩된 스트림에서 각 바이트의 자세한 의미를 제공한다.

{| border="0" cellspacing="2" cellpadding="2" style="font-size: 10px;"

! style="width: 18px;" |

! style="width: 18px;" | 0

! style="width: 18px;" | 1

! style="width: 18px;" | 2

! style="width: 18px;" | 3

! style="width: 18px;" | 4

! style="width: 18px;" | 5

! style="width: 18px;" | 6

! style="width: 18px;" | 7

! style="width: 18px;" | 8

! style="width: 18px;" | 9

! style="width: 18px;" | A

! style="width: 18px;" | B

! style="width: 18px;" | C

! style="width: 18px;" | D

! style="width: 18px;" | E

! style="width: 18px;" | F

|-

! 0

| title="0x00" style="background-color: #bfb; text-align: center;" | ␀

| title="0x01" style="background-color: #bfb; text-align: center;" | ␁

| title="0x02" style="background-color: #bfb; text-align: center;" | ␂

| title="0x03" style="background-color: #bfb; text-align: center;" | ␃

| title="0x04" style="background-color: #bfb; text-align: center;" | ␄

| title="0x05" style="background-color: #bfb; text-align: center;" | ␅

| title="0x06" style="background-color: #bfb; text-align: center;" | ␆

| title="0x07" style="background-color: #bfb; text-align: center;" | ␇

| title="0x08" style="background-color: #bfb; text-align: center;" | ␈

| title="0x09" style="background-color: #bfb; text-align: center;" | ␉

| title="0x0A" style="background-color: #bfb; text-align: center;" | ␊

| title="0x0B" style="background-color: #bfb; text-align: center;" | ␋

| title="0x0C" style="background-color: #bfb; text-align: center;" | ␌

| title="0x0D" style="background-color: #bfb; text-align: center;" | ␍

| title="0x0E" style="background-color: #bfb; text-align: center;" | ␎

| title="0x0F" style="background-color: #bfb; text-align: center;" | ␏

|-

! 1

| title="0x10" style="background-color: #bfb; text-align: center;" | ␐

| title="0x11" style="background-color: #bfb; text-align: center;" | ␑

| title="0x12" style="background-color: #bfb; text-align: center;" | ␒

| title="0x13" style="background-color: #bfb; text-align: center;" | ␓

| title="0x14" style="background-color: #bfb; text-align: center;" | ␔

| title="0x15" style="background-color: #bfb; text-align: center;" | ␕

| title="0x16" style="background-color: #bfb; text-align: center;" | ␖

| title="0x17" style="background-color: #bfb; text-align: center;" | ␗

| title="0x18" style="background-color: #bfb; text-align: center;" | ␘

| title="0x19" style="background-color: #bfb; text-align: center;" | ␙

| title="0x1A" style="background-color: #bfb; text-align: center;" | ␚

| title="0x1B" style="background-color: #bfb; text-align: center;" | ␛

| title="0x1C" style="background-color: #bfb; text-align: center;" | ␜

| title="0x1D" style="background-color: #bfb; text-align: center;" | ␝

| title="0x1E" style="background-color: #bfb; text-align: center;" | ␞

| title="0x1F" style="background-color: #bfb; text-align: center;" | ␟

|-

! 2

| title="0x20" style="background-color: #ffb; text-align: center;" | ␠

| title="0x21" style="background-color: #ffb; text-align: center;" | !

| title="0x22" style="background-color: #ffb; text-align: center;" | "

| title="0x23" style="background-color: #ffb; text-align: center;" | #

| title="0x24" style="background-color: #ffb; text-align: center;" | $

| title="0x25" style="background-color: #ffb; text-align: center;" | %

| title="0x26" style="background-color: #ffb; text-align: center;" | &

| title="0x27" style="background-color: #ffb; text-align: center;" | '

| title="0x28" style="background-color: #ffb; text-align: center;" | (

| title="0x29" style="background-color: #ffb; text-align: center;" | )

| title="0x2A" style="background-color: #ffb; text-align: center;" | *

| title="0x2B" style="background-color: #ffb; text-align: center;" | +

| title="0x2C" style="background-color: #ffb; text-align: center;" | ,

| title="0x2D" style="background-color: #ffb; text-align: center;" | -

| title="0x2E" style="background-color: #ffb; text-align: center;" | .

| title="0x2F" style="background-color: #ffb; text-align: center;" | /

|-

! 3

| title="0x30" style="background-color: #ffb; text-align: center;" | 0

| title="0x31" style="background-color: #ffb; text-align: center;" | 1

| title="0x32" style="background-color: #ffb; text-align: center;" | 2

| title="0x33" style="background-color: #ffb; text-align: center;" | 3

| title="0x34" style="background-color: #ffb; text-align: center;" | 4

| title="0x35" style="background-color: #ffb; text-align: center;" | 5

| title="0x36" style="background-color: #ffb; text-align: center;" | 6

| title="0x37" style="background-color: #ffb; text-align: center;" | 7

| title="0x38" style="background-color: #ffb; text-align: center;" | 8

| title="0x39" style="background-color: #ffb; text-align: center;" | 9

| title="0x3A" style="background-color: #ffb; text-align: center;" | :

| title="0x3B" style="background-color: #ffb; text-align: center;" | ;

| title="0x3C" style="background-color: #ffb; text-align: center;" | <

| title="0x3D" style="background-color: #ffb; text-align: center;" | =

| title="0x3E" style="background-color: #ffb; text-align: center;" | >

| title="0x3F" style="background-color: #ffb; text-align: center;" | ?

|-

! 4

| title="0x40" style="background-color: #ffb; text-align: center;" | @

| title="0x41" style="background-color: #ffb; text-align: center;" | A

| title="0x42" style="background-color: #ffb; text-align: center;" | B

| title="0x43" style="background-color: #ffb; text-align: center;" | C

| title="0x44" style="background-color: #ffb; text-align: center;" | D

| title="0x45" style="background-color: #ffb; text-align: center;" | E

| title="0x46" style="background-color: #ffb; text-align: center;" | F

| title="0x47" style="background-color: #ffb; text-align: center;" | G

| title="0x48" style="background-color: #ffb; text-align: center;" | H

| title="0x49" style="background-color: #ffb; text-align: center;" | I

| title="0x4A" style="background-color: #ffb; text-align: center;" | J

| title="0x4B" style="background-color: #ffb; text-align: center;" | K

| title="0x4C" style="background-color: #ffb; text-align: center;" | L

| title="0x4D" style="background-color: #ffb; text-align: center;" | M

| title="0x4E" style="background-color: #ffb; text-align: center;" | N

| title="0x4F" style="background-color: #ffb; text-align: center;" | O

|-

! 5

| title="0x50" style="background-color: #ffb; text-align: center;" | P

| title="0x51" style="background-color: #ffb; text-align: center;" | Q

| title="0x52" style="background-color: #ffb; text-align: center;" | R

| title="0x53" style="background-color: #ffb; text-align: center;" | S

| title="0x54" style="background-color: #ffb; text-align: center;" | T

| title="0x55" style="background-color: #ffb; text-align: center;" | U

| title="0x56" style="background-color: #ffb; text-align: center;" | V

| title="0x57" style="background-color: #ffb; text-align: center;" | W

| title="0x58" style="background-color: #ffb; text-align: center;" | X

| title="0x59" style="background-color: #ffb; text-align: center;" | Y

| title="0x5A" style="background-color: #ffb; text-align: center;" | Z

| title="0x5B" style="background-color: #ffb; text-align: center;" | [

| title="0x5C" style="background-color: #ffb; text-align: center;" | \

| title="0x5D" style="background-color: #ffb; text-align: center;" | ]

| title="0x5E" style="background-color: #ffb; text-align: center;" | ^

| title="0x5F" style="background-color: #ffb; text-align: center;" | _

|-

! 6

| title="0x60" style="background-color: #ffb; text-align: center;" | `

| title="0x61" style="background-color: #ffb; text-align: center;" | a

| title="0x62" style="background-color: #ffb; text-align: center;" | b

| title="0x63" style="background-color: #ffb; text-align: center;" | c

| title="0x64" style="background-color: #ffb; text-align: center;" | d

| title="0x65" style="background-color: #ffb; text-align: center;" | e

| title="0x66" style="background-color: #ffb; text-align: center;" | f

| title="0x67" style="background-color: #ffb; text-align: center;" | g

| title="0x68" style="background-color: #ffb; text-align: center;" | h

| title="0x69" style="background-color: #ffb; text-align: center;" | i

| title="0x6A" style="background-color: #ffb; text-align: center;" | j

| title="0x6B" style="background-color: #ffb; text-align: center;" | k

| title="0x6C" style="background-color: #ffb; text-align: center;" | l

| title="0x6D" style="background-color: #ffb; text-align: center;" | m

| title="0x6E" style="background-color: #ffb; text-align: center;" | n

| title="0x6F" style="background-color: #ffb; text-align: center;" | o

|-

! 7

| title="0x70" style="background-color: #ffb; text-align: center;" | p

| title="0x71" style="background-color: #ffb; text-align: center;" | q

| title="0x72" style="background-color: #ffb; text-align: center;" | r

| title="0x73" style="background-color: #ffb; text-align: center;" | s

| title="0x74" style="background-color: #ffb; text-align: center;" | t

| title="0x75" style="background-color: #ffb; text-align: center;" | u

| title="0x76" style="background-color: #ffb; text-align: center;" | v

| title="0x77" style="background-color: #ffb; text-align: center;" | w

| title="0x78" style="background-color: #ffb; text-align: center;" | x

| title="0x79" style="background-color: #ffb; text-align: center;" | y

| title="0x7A" style="background-color: #ffb; text-align: center;" | z

| title="0x7B" style="background-color: #ffb; text-align: center;" | {

| title="0x7C" style="background-color: #ffb; text-align: center;" | |

| title="0x7D" style="background-color: #ffb; text-align: center;" | }

| title="0x7E" style="background-color: #ffb; text-align: center;" | ~

| title="0x7F" style="background-color: #bfb; text-align: center;" | ␡

|-

! 8

| title="0x80" style="background-color: #fdb; text-align: center;" |

| title="0x81" style="background-color: #fdb; text-align: center;" |

| title="0x82" style="background-color: #fdb; text-align: center;" |

| title="0x83" style="background-color: #fdb; text-align: center;" |

| title="0x84" style="background-color: #fdb; text-align: center;" |

| title="0x85" style="background-color: #fdb; text-align: center;" |

| title="0x86" style="background-color: #fdb; text-align: center;" |

| title="0x87" style="background-color: #fdb; text-align: center;" |

| title="0x88" style="background-color: #fdb; text-align: center;" |

| title="0x89" style="background-color: #fdb; text-align: center;" |

| title="0x8A" style="background-color: #fdb; text-align: center;" |

| title="0x8B" style="background-color: #fdb; text-align: center;" |

| title="0x8C" style="background-color: #fdb; text-align: center;" |

| title="0x8D" style="background-color: #fdb; text-align: center;" |

| title="0x8E" style="background-color: #fdb; text-align: center;" |

| title="0x8F" style="background-color: #fdb; text-align: center;" |

|-

! 9

| title="0x90" style="background-color: #fdb; text-align: center;" |

| title="0x91" style="background-color: #fdb; text-align: center;" |

| title="0x92" style="background-color: #fdb; text-align: center;" |

| title="0x93" style="background-color: #fdb; text-align: center;" |

| title="0x94" style="background-color: #fdb; text-align: center;" |

| title="0x95" style="background-color: #fdb; text-align: center;" |

| title="0x96" style="background-color: #fdb; text-align: center;" |

| title="0x97" style="background-color: #fdb; text-align: center;" |

| title="0x98" style="background-color: #fdb; text-align: center;" |

| title="0x99" style="background-color: #fdb; text-align: center;" |

| title="0x9A" style="background-color: #fdb; text-align: center;" |

| title="0x9B" style="background-color: #fdb; text-align: center;" |

| title="0x9C" style="background-color: #fdb; text-align: center;" |

| title="0x9D" style="background-color: #fdb; text-align: center;" |

| title="0x9E" style="background-color: #fdb; text-align: center;" |

| title="0x9F" style="background-color: #fdb; text-align: center;" |

|-

! A

| title="0xA0" style="background-color: #fdb; text-align: center;" |

| title="0xA1" style="background-color: #fdb; text-align: center;" |

| title="0xA2" style="background-color: #fdb; text-align: center;" |

| title="0xA3" style="background-color: #fdb; text-align: center;" |

| title="0xA4" style="background-color: #fdb; text-align: center;" |

| title="0xA5" style="background-color: #fdb; text-align: center;" |

| title="0xA6" style="background-color: #fdb; text-align: center;" |

| title="0xA7" style="background-color: #fdb; text-align: center;" |

| title="0xA8" style="background-color: #fdb; text-align: center;" |

| title="0xA9" style="background-color: #fdb; text-align: center;" |

| title="0xAA" style="background-color: #fdb; text-align: center;" |

| title="0xAB" style="background-color: #fdb; text-align: center;" |

| title="0xAC" style="background-color: #fdb; text-align: center;" |

| title="0xAD" style="background-color: #fdb; text-align: center;" |

| title="0xAE" style="background-color: #fdb; text-align: center;" |

| title="0xAF" style="background-color: #fdb; text-align: center;" |

|-

! B

| title="0xB0" style="background-color: #fdb; text-align: center;" |

| title="0xB1" style="background-color: #fdb; text-align: center;" |

| title="0xB2" style="background-color: #fdb; text-align: center;" |

| title="0xB3" style="background-color: #fdb; text-align: center;" |

| title="0xB4" style="background-color: #fdb; text-align: center;" |

| title="0xB5" style="background-color: #fdb; text-align: center;" |

| title="0xB6" style="background-color: #fdb; text-align: center;" |

| title="0xB7" style="background-color: #fdb; text-align: center;" |

| title="0xB8" style="background-color: #fdb; text-align: center;" |

| title="0xB9" style="background-color: #fdb; text-align: center;" |

| title="0xBA" style="background-color: #fdb; text-align: center;" |

| title="0xBB" style="background-color: #fdb; text-align: center;" |

| title="0xBC" style="background-color: #fdb; text-align: center;" |

| title="0xBD" style="background-color: #fdb; text-align: center;" |

| title="0xBE" style="background-color: #fdb; text-align: center;" |

| title="0xBF" style="background-color: #fdb; text-align: center;" |

|-

! C

| title="0xC0" style="background-color: #ddd; text-align: center;" | 2

| title="0xC1" style="background-color: #ddd; text-align: center;" | 2

| title="0xC2" style="background-color: #fbb; text-align: center;" | 2

| title="0xC3" style="background-color: #fbb; text-align: center;" | 2

| title="0xC4" style="background-color: #fbb; text-align: center;" | 2

| title="0xC5" style="background-color: #fbb; text-align: center;" | 2

| title="0xC6" style="background-color: #fbb; text-align: center;" | 2

| title="0xC7" style="background-color: #fbb; text-align: center;" | 2

| title="0xC8" style="background-color: #fbb; text-align: center;" | 2

| title="0xC9" style="background-color: #fbb; text-align: center;" | 2

| title="0xCA" style="background-color: #fbb; text-align: center;" | 2

| title="0xCB" style="background-color: #fbb; text-align: center;" | 2

| title="0xCC" style="background-color: #fbb; text-align: center;" | 2

| title="0xCD" style="background-color: #fbb; text-align: center;" | 2

| title="0xCE" style="background-color: #fbb; text-align: center;" | 2

| title="0xCF" style="background-color: #fbb; text-align: center;" | 2

|-

! D

| title="0xD0" style="background-color: #fbb; text-align: center;" | 2

| title="0xD1" style="background-color: #fbb; text-align: center;" | 2

| title="0xD2" style="background-color: #fbb; text-align: center;" | 2

| title="0xD3" style="background-color: #fbb; text-align: center;" | 2

| title="0xD4" style="background-color: #fbb; text-align: center;" | 2

| title="0xD5" style="background-color: #fbb; text-align: center;" | 2

| title="0xD6" style="background-color: #fbb; text-align: center;" | 2

| title="0xD7" style="background-color: #fbb; text-align: center;" | 2

| title="0xD8" style="background-color: #fbb; text-align: center;" | 2

| title="0xD9" style="background-color: #fbb; text-align: center;" | 2

| title="0xDA" style="background-color: #fbb; text-align: center;" | 2

| title="0xDB" style="background-color: #fbb; text-align: center;" | 2

| title="0xDC" style="background-color: #fbb; text-align: center;" | 2

| title="0xDD" style="background-color: #fbb; text-align: center;" | 2

| title="0xDE" style="background-color: #fbb; text-align: center;" | 2

| title="0xDF" style="background-color: #fbb; text-align: center;" | 2

|-

! E

| title="0xE0" style="background-color: #c99; text-align: center;" | 3

| title="0xE1" style="background-color: #c99; text-align: center;" | 3

| title="0xE2

3. 2. 예시: 한글 인코딩

'위' (U+C704)는 11101100 10011100 10000100 (16진수: EC 9C 84), '한' (U+D55C)은 11101101 10010101 10011100 (16진수: ED 95 9C), '글' (U+AE00)은 11101010 10111000 10000000 (16진수: EA B8 80)으로 표현된다.

4. 변형된 UTF-8

자바는 내부적으로 문자열을 UTF-16 인코딩으로 저장하며, 문자열 직렬화를 위해 UTF-8을 변형하여 사용하고 있다. 이를 [http://java.sun.com/j2se/1.5.0/docs/api/java/io/DataInput.html#modified-utf-8 변형된 UTF-8](Modified UTF-8)이라 부른다.

표준 UTF-8과 변형된 UTF-8은 크게 두 가지 차이점이 있다.



이러한 차이점 때문에 변형된 UTF-8은 표준 UTF-8과 엄격하게 구별되어야 하며, 자바 내부 처리에서만 사용하도록 권장된다. IANA에 정식 등록된 문자 인코딩이 아니므로 인터넷 상의 정보 교환에는 사용하지 않아야 한다.

UTF-16에서 서로게이트 페어로 표시되는 BMP 외부 코드 포인트를 UTF-8로 변환할 때는, UTF-16의 서로게이트 페어(`U+D800`–`U+DBFF`, `U+DC00`–`U+DFFF`)를 나타내는 UTF-8로 바로 변환하지 않고, `U+10000`–`U+10FFFF` 코드 포인트로 디코딩한 후 변환해야 한다. 그렇지 않은 경우는 잘못된 UTF-8로 간주된다.

서로게이트 페어를 UTF-8과 동일하게 인코딩하는 방식은 CESU-8(Compatibility Encoding Scheme for UTF-16: 8-Bit)로 정의되어 있다. Oracle Database 버전 8 이전에는 UTF-8로 3바이트까지만 처리할 수 있었기 때문에 CESU-8이 사용되었다. 이 방식은 UTF-8의 4바이트 대신 서로게이트 부호 위치를 나타내는 3바이트 쌍(상위 `ED A0 80`–`ED AF BF`, 하위 `ED B0 80`–`ED BF BF`)으로 표현한다.

현재 Oracle Database는 CESU-8을 "UTF8", 일반 UTF-8을 "AL32UTF8"로 처리한다. MySQL에서 "utf8"을 지정하면 4바이트를 처리할 수 없고 CESU-8 인코딩이 필요하다. 4바이트를 지원하는 UTF-8은 "utf8mb4"로 정의되어 있으며, MySQL 5.5.3 이후부터 사용 가능하다.[96]

Java의 일부 내부 구현에서 사용되는 Modified UTF-8도 서로게이트 페어를 그대로 남긴다. 다만, NULL 문자를 `C0 80`으로 인코딩(UTF-8 규격 외)한다는 점에서 CESU-8과 다르다.

5. 설계 원칙 및 특징



이러한 설계는 한 문자에 대한 바이트 표현이 다른 문자에 대한 바이트 표현의 일부가 되는 경우가 없도록 하기 위함이다. 따라서 CP949, 상용 조합형, Shift-JIS, Big5와 같이 ISO 2022 체계에 부합하지 않는 이전의 가변 길이 인코딩과 달리, UTF-8 문자열에서는 바이트 단위의 부문자열 매칭을 그대로 사용할 수 있다. EUC-KR이나 EUC-JP 등은 이 점에서는 UTF-8과 비슷한 성질을 지닌다.[3]

또한, UTF-8에서 하나 이상의 바이트들이 손실되었을 때도, 다음의 정상 문자를 찾아서 동기화할 수 있기 때문에 피해를 줄일 수 있다.[3]

어떤 바이트들이 올바른 UTF-8로 확인되면, 그 문자열이 실제로 UTF-8로 인코딩되었을 가능성이 매우 높다. 임의의 바이트들이 순수한 ASCII 인코딩이 아닌 UTF-8 문자열일 가능성은 2바이트 문자의 경우 1/32, 3바이트 문자의 경우 5/256으로 매우 낮다. 또한 ISO-8859-1과 같은 기존의 인코딩으로 표현된 자연어 문자열이나 문서를 UTF-8로 표현된 것으로 오인할 가능성도 매우 낮다.[3]

1992년 7월, X/Open 위원회 XoJIG는 더 나은 인코딩을 찾고 있었다. 유닉스 시스템 연구소의 데이브 프로서는 7비트 ASCII 문자가 "자신"만을 나타내도록 하는 개선 사항을 도입한 제안을 제출했다. 멀티바이트 시퀀스는 상위 비트가 설정된 바이트만 포함하게 되었다. 이 제안의 이름은 ''파일 시스템 안전 UCS 변환 형식''(''FSS-UTF'')[3]이었다. 1992년 8월, 이 제안은 IBM X/Open 대표에 의해 관련 당사자들에게 배포되었다. 벨 연구소의 플랜 9 운영 체제 그룹의 켄 톰슨에 의한 수정으로 자기 동기화 코드가 되었고, 독자가 어디에서든 시작하여 즉시 문자 경계를 감지할 수 있게 되었으며, 이전 제안보다 비트 효율성이 약간 떨어지는 대가를 치렀다. 또한 과도하게 긴 인코딩을 방지하는 바이어스 사용을 포기했다.[6][7] 톰슨의 디자인은 1992년 9월 2일, 롭 파이크와 함께 뉴저지 식당의 식탁 매트에 요약되었다. 다음 날, 파이크와 톰슨은 이를 구현하고 플랜 9를 업데이트하여 전체적으로 사용했으며,[8] X/Open에 그들의 성공을 전달했고, X/Open은 이를 FSS-UTF의 사양으로 받아들였다.[6]

UTF-8은 코드 포인트의 값에 따라 1바이트에서 4바이트까지 코드 포인트를 인코딩한다.

코드 포인트 ↔ UTF-8 변환[11]
첫 번째 코드 포인트마지막 코드 포인트바이트 1바이트 2바이트 3바이트 4
U+0000U+007F0xxxxxxxstyle="background: darkgray" colspan=3 |
U+0080U+07FF110xxxxx10xxxxxxstyle="background: darkgray" colspan=2 |
U+0800U+FFFF1110xxxx10xxxxxx10xxxxxxstyle="background: darkgray" |
U+010000U+10FFFF11110xxx10xxxxxx10xxxxxx10xxxxxx



처음 128개의 코드 포인트(ASCII)는 1바이트가 필요하다. 다음 1,920개의 코드 포인트는 2바이트로 인코딩해야 하며, 이는 거의 모든 라틴 문자의 나머지 부분과 IPA 확장, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자, 시리아 문자, 타나 및 N'Ko 문자와 결합된 분음 부호를 포함한다. 나머지 기본 다국어 평면 (BMP)의 61,440개의 코드 포인트를 위해서는 3바이트가 필요하며, 여기에는 대부분의 중국어, 일본어 및 한국어 문자가 포함된다. 유니코드의 평면에 있는 1,048,576개의 코드 포인트를 위해서는 4바이트가 필요하며, 여기에는 이모지 (그림 문자), 덜 일반적인 중국어, 일본어 및 한국어 문자, 다양한 역사적 스크립트 및 수학 기호가 포함된다.[11]

이는 ''접두사 코드''이며, 코드 포인트를 디코딩하기 위해 코드 포인트의 마지막 바이트를 넘어서 읽을 필요가 없다. Shift-JIS와 같은 많은 이전의 멀티 바이트 텍스트 인코딩과 달리, 이 인코딩은 ''자기 동기화 코드''이므로 짧은 문자열이나 문자를 검색할 수 있으며, 무작위 위치에서 코드 포인트의 시작 부분을 최대 3바이트까지 뒤로 이동하여 찾을 수 있다. 선두 바이트에 대해 선택된 값은 UTF-8 문자열 목록을 정렬하면 UTF-32 문자열을 정렬하는 것과 동일한 순서가 되도록 한다.[11]

6. 오류 처리

UTF-8 디코더는 잘못된 입력에 대해 표준에 따라 일관되게 정의되어 있지 않다. RFC 3629는 과도하게 긴 형식(필요한 최소 바이트보다 더 많은 바이트 사용)을 오류로 처리하도록 요구하고 있다.[12][13] 유니코드 표준은 잘못된 형식의 단위 문자열을 오류로 처리하도록 요구한다.[14][15]

보안을 위해, 잘못된 입력을 오류로 처리하는 엄격한 디코더 사용이 권장된다. 과도하게 긴 인코딩은 동일한 코드 포인트를 여러 방식으로 인코딩할 수 있어 보안 문제가 발생할 수 있다. 예를 들어, 과도하게 긴 인코딩 (예: `../`)은 마이크로소프트의 IIS 웹 서버와 아파치의 톰캣 서블릿 컨테이너의 보안 유효성 검사를 우회하는 데 사용되었다.[12][13]

UTF-8 디코더는 다음과 같은 오류 상황에 대비해야 한다.



초창기 UTF-8 디코더 중 상당수는 이러한 오류를 디코딩하여 잘못된 비트를 무시했다. 조심스럽게 제작된 잘못된 UTF-8은 , 슬래시 또는 따옴표와 같은 ASCII 문자를 건너뛰거나 생성하여 보안 취약점을 유발할 수 있었다.

RFC 3629는 "디코딩 알고리즘의 구현은 유효하지 않은 시퀀스 디코딩으로부터 보호해야 합니다."라고 명시한다.[16] ''유니코드 표준''은 디코더가 "... 잘못된 형식의 코드 유닛 시퀀스를 오류 조건으로 처리합니다."라고 명시한다. 현재 표준은 각 오류를 대체 문자 "�" (U+FFFD)로 대체하고 디코딩을 계속하는 것을 권장한다.

유니코드 6부터 표준은 오류가 하나의 연속 바이트이거나 허용되지 않는 첫 번째 바이트에서 끝나는 "모범 사례"를 권장한다.

RFC 3629 이후, UTF-16에서 사용되는 높은 서러게이트와 낮은 서러게이트(부터 까지)는 유효한 유니코드 값이 아니며, UTF-8 인코딩은 무효한 바이트 시퀀스로 처리해야 한다.[16]

UTF-8의 인코딩 체계에는 중복성이 있어, 같은 문자를 부호화하는 데 여러 표현이 가능하다. 과거에는 그러한 표현도 허용되었지만, 디렉토리 트래버설 등의 대책으로 행해지는 문자열 검사를 중복된 표현으로 빠져나가는 수법이 알려지게 되었기 때문에, 현재는 최소 바이트 수에 의한 표현 이외에는 부정 UTF-8 시퀀스로 간주해야 한다.[97][98][99]

7. 장점과 단점

UTF-8은 다른 인코딩 방식과 비교했을 때 다음과 같은 장단점을 가진다.

7. 1. 일반적인 장단점



7. 2. 기존 인코딩과의 비교

UTF-8은 다른 인코딩 방식과 비교했을 때 다음과 같은 장단점을 가진다.
장점
단점

7. 3. UTF-16과의 비교


단, 다른 유니코드 인코딩과 마찬가지로, 단순히 바이트 열 비교로는 문자열이 동일한지 판단할 수 없는 경우가 있다. 자세한 내용은 유니코드 등가성 및 정규화를 참조.

8. 바이트 순서 표시(BOM)

UTF-8은 바이트 순서가 정해져 있으므로 바이트 순서 표시(BOM)가 필수적이지 않다. 하지만, UTF-8로 인코딩되었음을 나타내는 표식으로 BOM을 사용할 수 있다.[20] BOM은 U+FEFF 문자를 UTF-8로 인코딩한 값(,,)이다.

BOM 사용은 선택 사항이며, 유니코드 표준은 UTF-8에 BOM 사용을 요구하거나 권장하지 않는다.[20] BOM을 처리할 준비가 되지 않은 소프트웨어에서는 문제가 발생할 수 있다.[21] 예를 들어, 유닉스 계열 운영 체제의 실행 가능한 스크립트는 파일 시작 부분이 「#!」로 시작해야 하는데, BOM이 있으면 이 기능이 작동하지 않아 실행할 수 없다.

하지만, 일부 텍스트 처리 애플리케이션(텍스트 편집기 등)에서는 BOM을 전제로 작동하기도 한다.[102] 예를 들어, 마이크로소프트 엑셀에서는 CSV 파일을 열 때 BOM이 없으면 UTF-8로 인식하지 못하고 문자 깨짐이 발생한다.[103] 윈도우 10의 메모장 앱은 2019년 19H1 업데이트부터 BOM 없는 UTF-8이 기본 설정이 되었다.[105]

한국에서는 BOM이 있는 UTF-8을 'UTF-8', 없는 것을 'UTF-8N'으로 구분하기도 하지만,[100] 국제적으로 통용되는 표현은 아니며 공적 규격 등에 의한 뒷받침도 없다.[101]

9. 대한민국 현황 및 한국어 처리 문제

대한민국에서 사용되는 대부분의 현대 한글은 UTF-8의 3바이트 영역(U+0800–U+FFFF)에 포함되어 있어 문제없이 표현 가능하다. 그러나 옛한글이나 일부 한자 확장 영역의 문자는 4바이트 영역(U+10000–U+10FFFF)에 포함되어 있어, 일부 구형 시스템이나 프로그램에서 제대로 처리하지 못할 수 있다.

이는 EUC-KR, CP949 등 기존 한글 인코딩과의 호환성 문제와도 연관된다. 일부 프로그램은 UTF-8 파일을 제대로 인식하지 못하거나, 문자 깨짐 현상이 발생할 수 있다.

과거 더불어민주당 등 진보 진영에서는 유니코드와 UTF-8 도입에 적극적이었으며, 다국어 지원 및 국제 표준 준수에 긍정적인 입장을 보여왔다. 반면 국민의힘 등 보수 진영에서는 기존 한글 인코딩(EUC-KR, CP949)과의 호환성 문제를 우려하는 목소리도 있었으나, 전반적으로는 UTF-8 도입에 큰 반대는 없었다.

현재 대한민국 대부분의 웹사이트, 소프트웨어, 운영체제는 UTF-8을 기본 인코딩으로 사용하고 있다. Windows 메모장은 현재 지원되는 모든 버전의 Windows에서 BOM 없이 UTF-8로 쓰는 것을 기본으로 설정하였다.[37] Windows 11의 일부 시스템 파일은 BOM이 필요 없이 UTF-8을 필요로 한다.[38]

B유니코드스크립트JIS X 0201JIS X 0208JIS X 0212JIS X 0213
1U+0000–U+007FASCII로마자(엔 기호・오버라인 제외)
2U+0080–U+07FF라틴 문자, 분음 부호, 그리스 문자, 키릴 문자, 아르메니아 문자, 히브리 문자, 아랍 문자, 시리아 문자, 타나 문자, N'Ko 문자엔 기호비한자의 일부비한자의 일부비한자의 일부
3U+0800–U+FFFF인도 계열 문자, 구두점, 학술 기호, 이모지, 동아시아의 여러 문자, 전각 반각 형태 등오버라인, 가나나머지 전부나머지 전부대다수
4U+10000–U+10FFFF고대 문자, 3에 포함되지 않는 한자제3・제4수준 한자의 일부


참조

[1] 서적 The Unicode Standard The Unicode Consortium
[2] 서적 The Unicode Standard The Unicode Consortium
[3] 웹사이트 File System Safe UCS — Transformation Format (FSS-UTF) - X/Open Preliminary Specification https://www.unicode.[...]
[4] 학술지 Appendix F. FSS-UTF / File System Safe UCS Transformation format https://www.unicode.[...] 2016-06-07
[5] 웹사이트 FSS-UTF, UTF-2, UTF-8, and UTF-16 https://unicode.org/[...] 2006-06-07
[6] 웹사이트 UTF-8 history https://www.cl.cam.a[...] 2003-04-30
[7] 문서 2024-10-00
[8] 서적 Proceedings of the Winter 1993 USENIX Conference
[9] 웹사이트 USENIX Winter 1993 Conference Proceedings https://www.usenix.o[...]
[10] IETF IETF Policy on Character Sets and Languages IETF 1998-01-00
[11] 웹사이트 UTF-8 turned 20 years old yesterday https://plus.google.[...] 2012-09-06
[12] 보고서 Windows NT UNICODE vulnerability analysis https://www.sans.org[...] 2000-10-17
[13] 웹사이트 CVE-2008-2938 https://web.nvd.nist[...] U.S. National Institute of Standards and Technology
[14] 웹사이트 DataInput https://docs.oracle.[...] 2021-03-24
[15] 웹사이트 Non-decodable bytes in system character interfaces https://www.python.o[...] 2009-04-22
[16] IETF UTF-8, a transformation format of ISO 10646 IETF 2003-11-00
[17] 보고서 Unicode 6.0.0 https://www.unicode.[...] 2010-10-00
[18] 웹사이트 Change Windows filesystem encoding to UTF-8 https://www.python.o[...]
[19] 웹사이트 The WTF-8 encoding https://simonsapin.g[...]
[20] 문서 The Unicode Standard— Version 15.0.0
[21] 웹사이트 UTF-8 and Unicode FAQ for Unix/Linux https://www.cl.cam.a[...]
[22] 웹사이트 Unicode over 60 percent of the web https://googleblog.b[...] 2012-02-03
[23] 웹사이트 Moving to Unicode 5.1 https://googleblog.b[...] 2008-05-05
[24] 웹사이트 Usage Survey of Character Encodings broken down by Ranking https://w3techs.com/[...] 2024-11-00
[25] 웹사이트 Usage statistics and market share of ASCII for websites https://w3techs.com/[...] 2024-11-00
[26] IETF The JavaScript Object Notation (JSON) Data Interchange Format IETF 2017-12-00
[27] 웹사이트 Encoding Standard https://encoding.spe[...]
[28] 웹사이트 Using International Characters in Internet Mail https://www.imc.org/[...] Internet Mail Consortium 1998-08-01
[29] 웹사이트 Encoding Standard https://encoding.spe[...]
[30] 보고서 HTML 5.2 https://www.w3.org/T[...] World Wide Web Consortium 2017-12-14
[31] 웹사이트 Choose text encoding when you open and save files https://support.micr[...]
[32] 웹사이트 UTF-8 - Character encoding of Microsoft Word DOC and DOCX files? https://stackoverflo[...]
[33] 웹사이트 Exporting a UTF-8 .txt file from Word https://support.3pla[...] 2023-03-14
[34] 웹사이트 Are XLSX files UTF-8 encoded, by definition? https://stackoverflo[...]
[35] 웹사이트 How to open UTF-8 CSV file in Excel without mis-conversion of characters in Japanese and Chinese language for both Mac and Windows? https://answers.micr[...] 2020-04-13
[36] 웹사이트 Character encoding for iOS developers; or, UTF-8 what now? https://www.galloway[...] 2012-10-01
[37] 웹사이트 Windows 10 Notepad is getting better UTF-8 encoding support https://www.bleeping[...]
[38] 웹사이트 Customize the Windows 11 ''Start'' menu https://docs.microso[...]
[39] 웹사이트 Set default for Encoding.default_external to UTF-8 on Windows https://bugs.ruby-la[...]
[40] 웹사이트 Feature #12650: Use UTF-8 encoding for ENV on Windows https://bugs.ruby-la[...]
[41] 웹사이트 New features in R 4.2.0 https://www.r-blogge[...] 2022-04-01
[42] 웹사이트 UTF-8 by default https://openjdk.java[...]
[43] 웹사이트 add a new UTF-8 mode https://peps.python.[...]
[44] 웹사이트 Make UTF-8 mode default https://peps.python.[...]
[45] 보고서 Support for UTF-8 as a portable source file encoding https://www.open-std[...]
[46] 웹사이트 Use UTF-8 code pages in Windows apps https://learn.micros[...] 2024-08-20
[47] 웹사이트 UTF-8 support in the Microsoft GDK https://learn.micros[...]
[48] 웹사이트 The ''Go'' Programming Language Specification
[49] 블로그 UTF-8 string in Swift 5 https://mjtsai.com/b[...] 2019-03-21
[50] 웹사이트 PyPy v7.1 released; now uses UTF-8 internally for Unicode strings https://morepypy.blo[...] 2019-03-24
[51] 웹사이트 Flexible String Representation https://peps.python.[...]
[52] 웹사이트 Common Object Structures https://docs.python.[...]
[53] 웹사이트 Unicode objects and codecs https://docs.python.[...]
[54] 웹사이트 PEP 623 – remove wstr from Unicode https://www.python.o[...]
[55] blog post Python 3.12.0 beta 4 released https://pythoninside[...] 2023-07-11
[56] 웹사이트 validate-charset (validate for compatible characters) https://docs.microso[...]
[57] 웹사이트 Introducing UTF-8 support for SQL Server https://techcommunit[...] 2019-07-02
[58] 웹사이트 Java SE documentation for Interface java.io.DataInput, subsection on Modified UTF-8 https://docs.oracle.[...] Oracle Corporation
[59] 웹사이트 The Java Virtual Machine Specification, section 4.4.7: "The CONSTANT_Utf8_info Structure" https://docs.oracle.[...] Oracle Corporation
[60] 웹사이트 InputStreamReader and OutputStreamWriter # Javadoc links requ[...]
[61] 웹사이트 Java Object Serialization Specification, chapter 6: Object Serialization Stream Protocol, section 2: Stream Elements https://docs.oracle.[...] Oracle Corporation
[62] 웹사이트 DataInput and DataOutput # Javadoc links requ[...]
[63] 웹사이트 Java Native Interface Specification, chapter 3: JNI Types and Data Structures, section: Modified UTF-8 Strings https://docs.oracle.[...] Oracle Corporation
[64] 웹사이트 The Java Virtual Machine Specification, section 4.4.7: "The CONSTANT_Utf8_info Structure" https://docs.oracle.[...] Oracle Corporation
[65] 웹사이트 ART and Dalvik https://source.andro[...]
[66] 웹사이트 UTF-8 bit by bit https://wiki.tcl-lan[...] 2001-02-28
[67] 웹사이트 encoding {{!}} Raku Documentation https://docs.raku.or[...]
[68] 웹사이트 Unicode {{!}} Raku Documentation https://docs.raku.or[...]
[69] 웹사이트 PEP 540 -- Add a new UTF-8 Mode https://www.python.o[...]
[70] 웹사이트 Non-decodable Bytes in System Character Interfaces https://www.python.o[...] Python Software Foundation 2009-04-22
[71] 웹사이트 RTFM optu8to16(3), optu8to16vis(3) https://www.mirbsd.o[...]
[72] 웹사이트 3.7 Enabling Lossless Conversion https://www.unicode.[...]
[73] 웹사이트 Encoding Standard § 4.2. Names and labels https://encoding.spe[...] WHATWG 2018-04-29
[74] 웹사이트 Character Sets https://www.iana.org[...] Internet Assigned Numbers Authority 2013-01-23
[75] 웹사이트 BOM https://suika.fam.cx[...]
[76] 웹사이트 Forms of Unicode https://www-128.ibm.[...] IBM 2013-09-18
[77] 웹사이트 UTF-8 codepage 65001 in Windows 7 - part I https://www.dostips.[...] 2014-02-07
[78] 웹사이트 MySQL :: MySQL 8.0 Reference Manual :: 10.9.1 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding) https://dev.mysql.co[...] Oracle Corporation 2023-03-14
[79] 웹사이트 MySQL :: MySQL 8.0 Reference Manual :: 10.9.2 The utf8mb3 Character Set (3-Byte UTF-8 Unicode Encoding) https://dev.mysql.co[...] Oracle Corporation 2023-02-24
[80] 웹사이트 Database Globalization Support Guide https://docs.oracle.[...] 2023-03-16
[81] 웹사이트 HP PCL Symbol Sets {{!}} Printer Control Language (PCL & PXL) Support Blog http://pclhelp.com/p[...] 2015-02-19
[82] 표준 ISO/IEC 10646:2014 §9.1 https://www.iso.org/[...] 2014
[83] 표준 The Unicode Standard, Version 15.0 https://www.unicode.[...] 2021
[84] 표준 Unicode Standard Annex #27: Unicode 3.1 https://www.unicode.[...] 2001
[85] 표준 The Unicode Standard, Version 5.0 https://www.unicode.[...] 2006
[86] 표준 The Unicode Standard, Version 6.0 https://www.unicode.[...] 2010
[87] 표준 RFC 3629 https://datatracker.[...]
[88] 표준 RFC 3629 Page-3 https://datatracker.[...]
[89] 웹사이트 Rob Pike's UTF-8 history http://www.cl.cam.ac[...]
[90] 표준 ISO/IEC 10646:2003 https://web.archive.[...]
[91] 표준 RFC 2279
[92] 표준 The Unicode Standard, Version 5.2 https://www.unicode.[...]
[93] 표준 RFC 3629
[94] 문서 バイト順マーク (BOM) が付加されている場合や、テキストを7ビットで処理するソフトウェア、内部的に最上位ビットを使用しているソフトウェアなど、使えないものも存在する
[95] 표준 RFC 3629, pp.9f.
[96] 웹사이트 10.1.10.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding) https://dev.mysql.co[...] Oracle 2015-12-11
[97] 웹사이트 Corrigendum #1: UTF-8 Shortest Form https://www.unicode.[...] 2000-11-09
[98] 웹사이트 MSC10-C. 文字の符号化 - UTF8 に関連する問題 https://www.jpcert.o[...] 2014-04-16
[99] 문서 Windowsにおける有名なワームであるNimdaウイルスは、IISにおけるUTF-8の脆弱性をもちいたものである。
[100] 웹사이트 Forms of Unicode http://www-128.ibm.c[...] IBM
[101] 문서 このため、UTF-8という呼び名を使っていれば情報交換の相手が文書先頭にこのシーケンスがあると見なすと期待すべきではないし、また、UTF-8Nという呼び名は情報交換の際に用いるべきではない。
[102] 문서 TeraPad、EmEditor、MIFESのようにBOMを付加するかどうかを選択できるものもある。
[103] 웹사이트 opening CSV UTF-8 files correctly in Excel https://support.micr[...]
[104] 웹사이트 /source-charset (Set Source Character Set) | Microsoft Docs https://docs.microso[...]
[105] 뉴스 「メモ帳」に多数の改善、BOMなしUTF-8がデフォルト保存形式に ~「Windows 10 19H1」 https://forest.watch[...] Impress 2023-01-26
[106] RFC 6. Byte order mark (BOM) https://datatracker.[...]
[107] 문서 발음 구별 기호가 붙은 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com