UTF-8과 유니 코드의 차이점은 무엇입니까?


503

Wikipedia UTF-8 페이지 에 따르면 사람들의 의견이 상충되는 것으로 들었습니다 .

그들은 똑같지 않습니까? 누군가가 명확히 할 수 있습니까?


1
이 위키가 유니 코드와 UTF에 대해 쓰는 것은 괜찮습니다. "UTF-8 (또는 다른 멀티 바이트 인코딩)에서 문자 중간에 문자열을 분리하거나 잘라낼 수 있으므로 문자열이 잘못 될 수 있습니다." 따라서 UTF-8로 인코딩 된 문자열은 더 이상 문자열이 아니라 바이트 배열 또는 바이트 스트림입니다. 문자열을 구성하는 문자가 인코딩됩니다. 물론 디코딩도 가능합니다. 물론 시작 바이트 이후 또는 다음 바이트 후에 utf-8 시퀀스를자를 수 있지만 왜 누군가 이것을해야합니까?
brighty

문자열 데이터 형식에 대한이 기사는 교육적입니다. mortoray.com/2013/11/27/the-string-type-is-broken- 때로는 문자열 및 해당 바이트 수준 구성 요소로 작업 할 때 실수로 문자를 반으로자를 수 있습니다 .
Everett

답변:


495

다른 사람들이 대답을 확장하려면 :

컴퓨터에 이상적으로 표시해야 할 문자가 많은 언어가 많이 있습니다. 유니 코드는 각 문자에 고유 번호 또는 코드 포인트를 할당합니다.

컴퓨터는 바이트와 같은 숫자를 처리합니다. 여기서 약간의 기록을 건너 뛰고 메모리 주소 문제를 무시하면 8 비트 컴퓨터는 8 비트 바이트를 하드웨어에서 쉽게 표현할 수있는 가장 큰 숫자 단위로 취급합니다 .16 비트 컴퓨터는 확장됩니다. 그것은 2 바이트 등입니다.

ASCII와 같은 오래된 문자 인코딩은 (사전) 8 비트 시대에서 왔으며 당시 컴퓨팅에서 지배적 인 언어, 즉 영어를 0에서 127 (7 비트) 범위의 숫자로 작성하려고합니다. 알파벳과 대문자가 아닌 대문자, 숫자 및 문장 부호로 된 26 자로 된 알파벳은 꽤 잘 작동했습니다. ASCII는 영어 이외의 다른 언어의 경우 8 비트로 확장되었지만이 확장으로 사용 가능한 추가 128 개의 숫자 / 코드 포인트는 표시되는 언어에 따라 다른 문자로 매핑됩니다. ISO-8859 표준은이 매핑의 가장 일반적인 형태입니다. ISO-8859-1 및 ISO-8859-15 (ISO-Latin-1, latin1이라고도하며 8888 ISO 표준에는 두 가지 버전이 있습니다).

그러나 둘 이상의 언어로 된 문자를 나타내려면 충분하지 않으므로 사용 가능한 모든 문자를 단일 바이트로 크 래밍하면 작동하지 않습니다.

본질적으로 두 가지 다른 유형의 인코딩이 있습니다. 하나는 더 많은 비트를 추가하여 값 범위를 확장합니다. 이러한 인코딩의 예는 UCS2 (2 바이트 = 16 비트) 및 UCS4 (4 바이트 = 32 비트)입니다. ASCII 및 ISO-8859 표준과 본질적으로 동일한 문제로 어려움을 겪습니다. 한계가 크게 높아도 값 범위가 여전히 제한되어 있기 때문입니다.

다른 유형의 인코딩은 문자 당 가변 바이트 수를 사용하며 가장 일반적으로 알려진 인코딩은 UTF 인코딩입니다. 모든 UTF 인코딩은 대략 동일한 방식으로 작동합니다. UTF-8의 경우 8 비트, UTF-16의 경우 16 비트, UTF-32의 경우 32 비트 인 단위 크기를 선택합니다. 그런 다음 표준에서는 이러한 비트 중 일부를 플래그로 정의합니다. 비트가 설정되면 일련의 단위에서 다음 단위가 동일한 문자의 일부로 간주됩니다. 설정되지 않은 경우 본 기기는 한 문자를 완전히 나타냅니다. 따라서 가장 일반적인 (영어) 문자는 UTF-8에서 1 바이트 (UTF-16에서 2 개, UTF-32에서 4 개) 만 차지하지만 다른 언어 문자는 6 바이트 이상을 차지할 수 있습니다.

멀티 바이트 인코딩 (위의 설명 후에 멀티 유닛이라고 말해야 함)은 상대적으로 공간 효율적이라는 장점이 있지만 하위 문자열 찾기, 비교 등과 같은 작업은 모두 문자를 유니 코드 코드로 디코딩해야한다는 단점이 있습니다. 이러한 작업을 수행하기 전의 포인트 (단축키가 있음)가 있습니다.

UCS 표준과 UTF 표준은 모두 유니 코드에 정의 된대로 코드 포인트를 인코딩합니다. 이론적으로 이러한 인코딩은 인코딩이 지원하는 범위 내에서 임의의 수를 인코딩하는 데 사용될 수 있지만 물론 이러한 인코딩은 유니 코드 코드 포인트를 인코딩하기 위해 만들어졌습니다. 그리고 그것은 그들 사이의 관계입니다.

Windows는 소위 "유니 코드"문자열을 UTF-16 문자열로 처리하지만 대부분의 UNIX는 기본적으로 UTF-8로 기본 설정되어 있습니다. UTF-8의 단위 크기는 ASCII와 같으며 대부분의 프로토콜은 ASCII 시대에 설계되었으므로 HTTP와 같은 통신 프로토콜은 UTF-8에서 가장 잘 작동하는 경향이 있습니다. 반면에 UTF-16은 최고의 평균을 제공합니다. 모든 살아있는 언어를 표현할 때 공간 / 처리 성능을 .

유니 코드 표준은 32 비트로 표현할 수있는 것보다 적은 코드 포인트를 정의합니다. 따라서 모든 실제적인 목적으로 UTF-32와 UCS4는 UTF-32의 다중 단위 문자를 다룰 필요가 없으므로 동일한 인코딩이되었습니다.

희망은 몇 가지 세부 사항을 채 웁니다.


9
개념적으로 UCS-2 및 UCS-4는 문자 인코딩이 아니라 문자 세트 (따라서 이름)입니다.
기계 달팽이

74
이 게시물의 오류는 레기온입니다. ISO 8859에는 2 가지 이상의 버전이 있습니다. ASCII는 영어에서 작동하지 않으며, 중괄호, 센트 부호, 악센트 및 그 밖의 많은 것들이 없습니다. 유니 코드는 영어 이외의 언어 가 아닙니다 . 영어도 필요합니다 !! 모든 인코딩 에서 4 바이트 이상을 차지하는 코드 포인트는 없습니다 . 이 6 바이트 사업은 잘못되었습니다. 다음과 같이 유니 코드 스칼라 값을 UTF 인코딩 할 수 없습니다. surrogates 및 66 개의 다른 비문자는 모두 금지됩니다. UCS-4와 UTF-32는 동일하지 않습니다. 다중 단위 UTF-32는 없습니다. UTF-16은 척하는 것만 큼 효율적이지 않습니다 – & c & c & c!
tchrist

1
ASCII는 파운드 기호 £도 포함하지 않으며 유로 기호 €도 포함하지 않습니다 (ASCII보다 상당히 젊음).
TRiG

1
@tchrist 결국 6 바이트 불가능하지 않은 것으로 보인다 . 다음을 참조하십시오 : joelonsoftware.com/articles/Unicode.html 이것은 0x04000000~ 에서 문자 공간이 0x7FFFFFFF있거나 이진수로 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv -이며 실제로 6 바이트임을 나타냅니다. 그러나 6 바이트는 최대 값 이며 기사가 "6 바이트 이상 "을 혼동스럽게 주장하는 것은 아닙니다 .
syntaxerror

12
@syntaxerror : "코드 포인트 128 이상 만 2, 3, 실제로는 최대 6 바이트를 사용하여 저장됩니다." 작성 당시에는 정확했지만 같은 해 (12 년 전) 무효화되었습니다. en.wikipedia.org/wiki/UTF-8 은 "원래 사양은 최대 31 비트 (범용 문자 집합의 원래 제한)까지의 숫자를 포함했습니다."2003 년 11 월, UTF-8은 RFC 3629에 의해 U +에서 끝나도록 제한되었습니다. UTF-16 문자 인코딩의 제약 조건과 일치시키기 위해 10FFFF. 5 바이트 및 6 바이트 시퀀스와 4 바이트 시퀀스의 약 절반을 모두 제거했습니다. "
Mooing Duck

237

이 주제를 설명하기 위해 예제를 사용하겠습니다.

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

지금까지 마술은 없었습니다. 매우 간단합니다. 이제이 문자를 하드 드라이브에 저장하기로 결정했다고 가정하겠습니다. 그러기 위해서는 문자를 이진 형식으로 저장해야합니다. '01101100 01001001'그대로 그대로 보관할 수 있습니다. 끝난!

하지만 잠깐만, '01101100 01001001'은 한 글자입니까, 두 글자입니까? 내가 말했기 때문에 이것이 한 캐릭터라는 것을 알았지 만 컴퓨터가 읽을 때는 전혀 모른다. 따라서 컴퓨터가 컴퓨터를 하나로 취급하도록하려면 일종의 "인코딩"이 필요합니다.

'UTF-8'의 규칙은 다음과 같습니다. http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

위의 표에 따르면, 'UTF-8'형식을 사용하여이 문자를 저장하려면 문자 앞에 '헤더'를 붙여야합니다. 중국어 문자는 16 비트 길이 (이진 값을 직접 계산)이므로 충분한 공간을 제공하므로 행 3의 형식을 사용합니다.

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

한 줄로 결과를 작성하십시오.

11100110 10110001 10001001

한자의 UTF-8 (이진) 값입니다! (직접 확인하십시오 : http://www.fileformat.info/info/unicode/char/6c49/index.htm )

요약

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

추신 : 파이썬 에서이 주제를 배우려면 여기를 클릭하십시오.


6
"하지만 잠깐만 기다리십시오. '01101100 01001001'은 한 문자 또는 두 문자입니까? 제가 말 했으므로이 문자는 한 문자라는 것을 알았지 만 컴퓨터가 읽을 때는 전혀 알 수 없습니다. 컴퓨터를 하나로 취급하라고 지시하십시오. " 글쎄,하지만 컴퓨터는 여전히 utf-8로 인코딩 해야하는지 모른다.
Koray Tugay

15
@KorayTugay 컴퓨터는 어떤 인코딩을 사용해야하는지 모릅니다. 파일에 문자를 저장할 때와 파일에서 문자를 읽을 때도 알려야합니다.
Cheng

3
@Connor 컴퓨터는 사용할 형식을 모릅니다. 문서를 저장할 때 텍스트 편집기는 인코딩을 utf-8 또는 사용자가 사용하려는 형식으로 명시 적으로 설정해야합니다. 또한 텍스트 편집기 프로그램이 파일을 읽을 때 올바르게 디코딩하려면 텍스트 인코딩 체계를 선택해야합니다. 문자를 입력하고 입력 할 때도 마찬가지입니다. 텍스트 편집기는 사용하는 체계를 알고 있어야 제대로 저장됩니다.
Cheng

2
그렇다면 이러한 헤더는 어떻게 해석됩니까? 첫 번째 테이블을 보면 다음과 같이 생각합니다. 바이트가 비트로 시작 0하면 문자가 1 바이트 (현재 바이트)로 표시되고 바이트가 시작 110하면 문자가 2 바이트 (현재 및 다음 바이트로 표시됨) 10)) 이후의 나머지 비트 ), 바이트로 시작하는 1110경우 문자는 3 바이트, 현재 및 다음 2 바이트 (이후의 나머지 비트 10)로 표시됩니다.
JBoy

2
UTF-8에 대한 기사 10 개를 읽으십시오. 이것을 읽은 후 나는 10 초 안에 이해했다 :)
jrhee17

201

"유니 코드"는 불행히도 상황에 따라 다양한 방식으로 사용됩니다. 가장 올바른 용도 (IMO)는 코드화 된 문자 세트입니다 . 즉 문자 세트 와 이를 나타내는 문자와 정수 코드 포인트 간의 맵핑 입니다.

UTF-8 은 문자 인코딩-바이트 시퀀스에서 문자 시퀀스로 또는 그 반대로 변환하는 방법입니다. 유니 코드 문자 집합 전체를 다룹니다. ASCII는 문자 당 단일 바이트로 인코딩되며 다른 문자는 정확한 코드 포인트 (현재 정의 된 모든 코드 포인트에 대해 최대 4 바이트, 즉 U-0010FFFF까지)에 따라 더 많은 바이트를 사용하며 실제로 4 바이트는 최대 U-001FFFFF).

"유니 코드"가 문자 인코딩의 이름 (예 : .NET Encoding.Unicode 속성)으로 사용되는 경우 일반적으로 UTF-16을 의미합니다. 가장 일반적인 문자를 2 바이트로 인코딩 합니다. 일부 플랫폼 (특히 .NET 및 Java)은 UTF-16을 "기본"문자 인코딩으로 사용합니다. 단일 UTF-16 값으로 인코딩 할 수없는 문자 ( "서로 게이트 쌍"으로 인코딩 됨)에 대해 걱정해야하는 경우에는 털이 문제가되지만 대부분의 개발자는 이에 대해 걱정하지 않습니다 (IME).

유니 코드에 대한 일부 참조 :


16
UTF-16은 Windows 플랫폼에서 "유니 코드"와만 같다고 생각합니다. 사람들은 기본적으로 * nix에서 UTF-8을 사용하는 경향이 있습니다. +1, 좋은 답변
jalf

10
@Chris : 아니요. ISO-8859-1은 UTF-8 이 아닙니다 . UTF-8은 U + 0080에서 U + 00FF를 1 바이트가 아닌 2 바이트로 인코딩합니다. Windows 1252와 ISO-8859-1은 대부분 동일하지만, 올바르게 기억하면 0x80과 0x99 사이의 값이 다릅니다. ISO 8859-1에 "구멍"이 있지만 CP1252는 문자를 정의합니다.
Jon Skeet 2012 년

13
UTF-16 "유니 코드"를 호출한다는 아이디어는 혼동 할 가능성 때문에 혼란스러워 할 수 있습니다. 비록 이것이 .NET 규칙으로 만 지적 되었더라도 말입니다. UTF-16은 유니 코드를 나타내는 방법이지만 "유니 코드 인코딩"은 아닙니다.
thomasrutter

6
@unwesen : UTF-8에는 서로 게이트 쌍이 필요하지 않습니다. 점진적으로 긴 바이트 시퀀스를 사용하여 BMP 이외의 문자 만 나타냅니다.
Jon Skeet

5
@RoyiNamir : 예, "유니 코드"는 불행히도 특히 Windows에서 "UTF-16"을 의미하는 데 자주 사용됩니다.
Jon Skeet

108

UTF-8은 유니 코드를 인코딩하는 특별한 방법입니다.

응용 프로그램과 사용하려는 데이터에 따라 다양한 인코딩을 선택할 수 있습니다. 내가 아는 한 가장 일반적인 것은 UTF-8, UTF-16 및 UTF-32입니다.


10
그러나 요점은 일부 편집기는 파일을 "유니 코드"또는 "UTF-8"로 저장하도록 제안한다는 것입니다. 이 경우 "유니 코드"에 대한 언급은 UTF-16입니다.
serhio

71

유니 코드는 코드 포인트 , 즉 문자를 나타내는 숫자 만 정의 합니다 . 이러한 코드 포인트를 메모리에 저장하는 방법 은 사용 중인 인코딩에 따라 다릅니다 . UTF-8은 다른 많은 것들 중에서 유니 코드 문자를 인코딩하는 한 가지 방법입니다.


2
그러나 요점은 일부 편집기는 파일을 "유니 코드"또는 "UTF-8"로 저장하도록 제안한다는 것입니다. 이 경우 "유니 코드"에 대한 언급은 UTF-16입니다.
serhio

문자를 나타내는 숫자는 ASCII도 수행합니다.
brighty

6
이 페이지의 나머지 답변을보기 전후에 이것을 읽으십시오
Dodgie

33

유니 코드 는 ISO / IEC 10646과 함께 UCS (Universal Character Set) 를 정의하는 표준으로, 실제로 알려진 모든 언어를 나타내는 데 필요한 모든 기존 문자의 수퍼 세트입니다.

유니 코드 는 레퍼토리의 각 문자에 이름과 숫자 ( 문자 코드 또는 코드 포인트 )를 지정합니다.

UTF-8 인코딩 은 컴퓨터 메모리에서 이러한 문자를 디지털 방식으로 나타내는 방법입니다. UTF-8은 각 코드 포인트를 일련의 8 진수 (8 비트 바이트)로 매핑합니다.

예를 들어

UCS 문자 = 유니 코드 한 문자

UCS 코드 포인트 = U + 24B62

UTF-8 인코딩 = F0 A4 AD A2 (16 진수) = 11110000 10100100 10101101 10100010 (bin)


아니요, UTF-8은 코드 포인트 만 127보다 큰 시퀀스로 매핑합니다. 0에서 127까지의 모든 것은 시퀀스가 ​​아니라 단일 바이트입니다. Btw에서 ASCII는 또한 문자의 이름을 숫자에 할당하므로 유니 코드와 동일합니다. 그러나 유니 코드는 코드 포인트 127에서 멈추지 않지만 0x10ffff까지 올라갑니다.
brighty 2016 년

2
@ 밝게 나는 다르다. 아스키 문자는 실제로 단일 바이트 시퀀스에 매핑됩니다. ASCII 문자 코드의 경우 첫 번째 비트 인 0은 뒤에 오는 바이트 수-0을 나타냅니다. http://www.wikiwand.com/en/UTF-8#/Description첫 번째 줄을보십시오.
nightlytrails

글쎄, 시퀀스는 하나 이상의 바이트로 구성됩니다. UTF-8 내의 ASCII 문자는 그대로 1 바이트이며, 최상위 비트는 0으로 설정됩니다. 127보다 높은 코드 포인트는 항상 시작 바이트와 1, 2, 3 개의 후속 바이트를 갖는 시퀀스가 ​​필요합니다. 그렇다면 왜 단일 바이트를 "시퀀스"라고 부르겠습니까?
brighty

글쎄 ... 많은 경우 영어 변호사가 소프트웨어에서 의도적으로 오용 된 것에 대해 당황 할 수 있습니다. 여기도 같은 경우입니다. 당신은 그것을 논쟁 할 수 있습니다. 그러나 그것은 더 명확하지 않습니다.
nightlytrails

1
@brighty Hmmm, 수학에서 0 개의 요소 시퀀스 는 괜찮습니다. 1 요소의 시퀀스도 여기에 좋습니다.
chux-복원 모니카

24

유니 코드 는 이 문자 세트를 인코딩하기 위해 문자 세트 ( UCS ) 및 인코딩 ( UTF )을 정의하는 표준 일뿐 입니다. 그러나 일반적으로 유니 코드는 표준이 아닌 문자 집합을 참조합니다.

읽기 , 절대 절대 최소 모든 소프트웨어 개발자를 긍정적으로 유니 코드와 문자 집합 (변명!)에 대해 알아야 하고 유니 코드에서 5 분 .


1
@serhio : 알아요. UTF-16 인코딩에는 세 가지가 있지만, 명시 적 UTF-16LEUTF-16BE 두 개와 엔디안이 BOM으로 지정된 암시 적 UTF-16 이 있습니다.
Gumbo

@Gumbo : BOM이 없다고해서 다른 인코딩이라는 의미는 아닙니다. 두 가지 인코딩 만 있습니다.
Mooing Duck

위의 블로그는 Stakcoverflow의 CEO가 작성했습니다.
Shailesh Pratapwar

23

기존 답변은 이미 많은 세부 사항을 설명하지만 가장 직접적인 설명과 예제가있는 매우 짧은 답변입니다.

유니 코드는 문자를 코드 포인트에 매핑 하는 표준 입니다.
각 문자에는 고유 코드 포인트 (식별 번호)가 있으며 9731과 같은 숫자입니다.

UTF-8은 코드 포인트 인코딩 입니다.
UTF-8은 디스크의 모든 문자를 파일로 저장하기 위해 문자를 최대 4 옥텟 (8 비트 시퀀스)-바이트로 분할합니다. UTF-8은 여러 인코딩 중 하나입니다 (데이터를 나타내는 방법). 예를 들어 유니 코드에서 (10 진수) 코드 포인트 9731은 눈사람 ( )을 나타내며 UTF-8에서 3 바이트로 구성됩니다.E2 98 83

다음은 임의의 예제 가 포함 된 정렬 된 목록입니다 .


1
아니! UTF-8은 유니 코드 문자를 인코딩하는 좋은 방법이지만 UTF-16 또는 UTF-32로 인코딩 할 수도 있습니다. UTF-32를 사용하면 DWORD와 코드 포인트 사이에 1 : 1 관계가 있고 UTF-16을 사용하면 서로 게이트와 BOM을 제외하고 BMP의 코드 포인트에 대해서만 WORD와 코드 포인트 사이에 1 : 1 관계가 있습니다. UTF-8에서는 코드 포인트 <127에 대해서만 바이트와 코드 포인트간에 1 : 1 관계가 있습니다.
brighty

5
@brighty : 맞습니다. 그런데 왜 "아니요!"? UTF-16과 UTF-32도 있기 때문에 "UTF-8은 여러 인코딩 중 하나입니다"라고 썼습니다 .
basic6

16

1. 유니 코드

전 세계에는 "$, &, h, a, t,?, 张, 1, =, + ..."와 같은 문자가 많이 있습니다.

그런 다음 이러한 캐릭터에 전념하는 조직이 있습니다.

그들은 "유니 코드"라는 표준을 만들었습니다.

표준은 다음과 같습니다.

  • 각 위치를 "코드 포인트"또는 "코드 위치"라고하는 양식을 작성하십시오.
  • 전체 위치는 U + 0000에서 U + 10FFFF입니다.
  • 지금까지 일부 위치는 문자로 채워지고 다른 위치는 저장되거나 비어 있습니다.
  • 예를 들어 위치 "U + 0024"는 "$"문자로 채워집니다.

PS : 물론 ISO와 같은 또 다른 표준 인 "ISO 10646"을 유지하는 또 다른 조직이 있습니다.

2. UTF-8

위와 같이 U + 0024는 위치이므로 문자 "$"에 대해 "U + 0024"를 컴퓨터에 저장할 수 없습니다.

인코딩 방법이 있어야합니다.

그런 다음 UTF-8, UTF-16, UTF-32, UCS-2 ...와 같은 인코딩 방법이 있습니다.

UTF-8에서 코드 포인트 "U + 0024"는 00100100으로 인코딩됩니다.

00100100은 "$"에 대해 컴퓨터에 저장하는 값입니다.


1
일반적으로 UTF-8은 오늘날 누구나 사용하는 유일한 변형입니다.
Rick James

2
ISO 10646은 유니 코드 문자 집합과 동일한 표준입니다. 유니 코드는 정렬 규칙, 대소 문자 등과 같은 문자 집합 이외의 많은 것을 정의합니다. ISO 10646은 문자 집합 일뿐입니다 (현재 130,000 개 이상). 유니 코드 컨소시엄과 ISO는 문자 집합 및 인코딩에만 관련된 ISO와 유니 코드도 공동으로 유니 코드를 개발하며, 텍스트 처리를위한 문자 속성 및 규칙도 정의합니다.
thomasrutter

12

Gumbo의 답변에서 링크를 확인했으며 스택 오버플로에도 존재하도록 여기에 일부를 붙여 넣기를 원했습니다.

"... 일부 사람들은 유니 코드가 각 문자가 16 비트를 사용하는 16 비트 코드이므로 65,536 개의 가능한 문자가 있다고 오해하고 있습니다. 실제로는 정확하지 않습니다. 이것이 유니 코드에 대한 가장 일반적인 통념입니다. 생각했다면 기분 나빠하지 마십시오.

실제로 유니 코드는 문자에 대해 다른 방식으로 생각하므로 사물에 대한 유니 코드 방식을 이해해야합니다.

지금까지는 문자가 디스크 나 메모리에 저장할 수있는 일부 비트로 매핑되는 것으로 가정했습니다.

A-> 0100 0001

유니 코드에서 문자는 여전히 이론적 인 개념 인 코드 포인트라고하는 것에 매핑됩니다. 코드 포인트가 메모리 나 디스크에 어떻게 표현되는지는 완전히 다른 이야기입니다 ... "

"... 모든 알파벳의 모든 플라토닉 문자는 다음과 같이 유니 코드 컨소시엄에 의해 매직 번호가 할당됩니다 : U + 0639.이 매직 번호는 코드 포인트라고합니다. U +는"유니 코드 "를 의미하며 숫자는 16 진수입니다. U + 0639는 아라비아 문자 Ain입니다. 영어 문자 A는 U + 0041 ...입니다. "

"... 알겠습니다. 문자열이 있다고 가정 해 봅시다.

여보세요

이는 유니 코드로 다음 5 가지 코드 포인트에 해당합니다.

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

많은 코드 포인트. 실제로는 숫자입니다. 아직 메모리에 저장하거나 이메일 메시지로 표시하는 방법에 대해서는 아직 언급하지 않았습니다 ... "

"... 이곳에서 인코딩이 시작됩니다.

2 바이트에 대한 신화를 가져온 유니 코드 인코딩의 초기 아이디어는이 숫자를 각각 2 바이트로 저장 하자는 것입니다. 그래서 안녕하세요 된다

00 48 00 65 00 6C 00 6C 00 6F

권리? 그렇게 빠르지 않습니다! 그것은 또한 수 없습니다 :

48 00 65 00 6C 00 6C 00 6F 00? ... "


ASCII에서 문자는 유니 코드뿐만 아니라 코드 포인트에도 매핑됩니다.
brighty

8

UTF-8유니 코드 텍스트의 가능한 인코딩 체계 중 하나 입니다.

유니 코드 는 130,000자를 초과하여 각각 숫자 코드 (코드 포인트)를 할당하는 광범위한 표준입니다. 또한이 텍스트를 정렬하고 정규화하고 대소 문자를 변경하는 방법 등에 대한 규칙을 정의합니다. 유니 코드의 문자는 0에서 0x10FFFF까지의 코드 포인트로 표시되지만 일부 코드 포인트는 예약되어 문자에 사용할 수 없습니다.

유니 코드 코드 포인트 문자열을 이진 스트림으로 인코딩 할 수있는 방법은 여러 가지가 있습니다. 이것을 "인코딩"이라고합니다. 가장 간단한 인코딩은 UTF-32 이며, 이는 각 코드 포인트를 32 비트 정수로 저장하며 각 바이트는 4 바이트입니다.

UTF-8 은 또 다른 인코딩이며 UTF-32 및 기타에 비해 여러 가지 장점으로 인해 사실상 표준이되고 있습니다. UTF-8은 일련의 단일 바이트 값으로 인코딩합니다. 각 코드 포인트는 이러한 바이트 값의 변수 수를 사용할 수 있습니다. ASCII 범위의 코드 포인트는 ASCII와 호환되도록 베어 인코딩됩니다. 이 범위를 벗어난 코드 포인트는 범위에 따라 가변 바이트 수 (2, 3 또는 4)를 사용합니다.

UTF-8은 다음 특성을 염두에두고 설계되었습니다.

  • ASCII 문자는 ASCII와 마찬가지로 정확하게 인코딩되므로 ASCII 문자열도 유효한 UTF-8 문자열입니다.

  • 이진 정렬 : 순진 이진 정렬을 사용하여 UTF-8 문자열을 정렬하면 여전히 모든 코드 포인트가 숫자 순서로 정렬됩니다.

  • 다중 바이트가 필요한 문자는 ASCII 범위의 바이트 값을 포함하지 않으므로 일부는 ASCII 문자로 오인 될 수 없습니다. 이것은 또한 보안 기능입니다.

  • UTF-8은 쉽게 유효성을 검사 할 수 있으며 유효성 검사기를 통해 다른 문자 인코딩과 구별 할 수 있습니다. 다른 8 비트 또는 멀티 바이트 인코딩의 텍스트도 UTF-8로 거의 유효하지 않습니다.

  • 임의 액세스 : UTF-8 문자열의 어느 시점에서나 해당 위치의 바이트가 문자의 첫 번째 바이트인지 아닌지를 알리고 앞으로 스캔 할 필요없이 다음 또는 현재 문자의 시작을 찾을 수 있습니다. 또는 몇 바이트 이상 뒤로 또는 스트림 시작 부분에서 무엇이든 읽습니다.


작은 포인트의 몇 : [1]해야하지 "그들이에 같은 ASCII 문자가 정확하게 인코딩 된 ASCII " 로 변경 "그들이에 정확하게 인코딩 된 ASCII 문자 UTF-8 " ? [2] "유니 코드로 된 코드 ..." 라는 문구 가 명확하지 않습니다. 당신은 의미합니까"유니 코드 코드 포인트 ..." 합니까?
skomisa

포인트 1의 @skomisa는 ASCII 범위의 문자 인코딩이 ASCII 및 UTF-8의 인코딩과 동일하다는 것을 의미했습니다.
thomasrutter

포인트 2의 경우, 그것은 공정한 포인트이며 그것을 명확히하기 위해 편집하겠습니다
thomasrutter

2

그들은 똑같지 않습니까?

아니요, 그렇지 않습니다.


나는 당신이 참조한 Wikipedia 페이지 의 첫 문장이 훌륭하고 간단한 요약을 제공 한다고 생각합니다 .

UTF-8은 1에서 4 개의 8 비트 바이트를 사용하여 유니 코드로 1,112,064 개의 유효한 코드 포인트를 모두 인코딩 할 수있는 가변 너비 문자 인코딩입니다.

정교하게 :

  • 유니 코드 는 표준으로, 문자에서 숫자 ( 소위 코드 포인트) 로의 맵 을 정의합니다 (아래 예와 같이). 전체 매핑을 보려면 여기를 살펴 보십시오 .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8은 이러한 코드 포인트를 컴퓨터가 이해할 수있는 형태 (일명 비트) 로 인코딩하는 방법 중 하나입니다 . 다시 말해, 각 코드 포인트를 비트 시퀀스로 변환하거나 비트 시퀀스를 동등한 코드 포인트로 변환하는 방법 / 알고리즘입니다. 유니 코드에 대한 많은 대체 인코딩이 있습니다.


Joel은 정말 멋진 설명과 역사에 대한 개요를 제공합니다 . .


2

이 스레드에서 수집 한 내용을 요약하면 다음과 같습니다.

유니 코드는 문자를 서수 (10 진수 형식)로 '번역' 합니다 .

à = 224

UTF-8은이 숫자를 이진 표현으로 '번역'하는 인코딩입니다 .

224 = 11000011 10100000

우리는 이진 형식이 아닌 224 의 이진 표현 에 대해 이야기하고 있습니다. 0b11100000입니다.


2

이 기사는 모든 세부 사항을 설명합니다 http://kunststube.net/encoding/

버퍼 쓰기

UTF8 인코딩 을 사용하여 4 바이트 버퍼, 기호에 쓰면 바이너리는 다음과 같습니다.

00000000 11100011 10000001 10000010

UTF16 인코딩 을 사용하여 4 바이트 버퍼, 기호에 쓰면 바이너리는 다음과 같습니다.

00000000 00000000 00110000 01000010

보시다시피, 콘텐츠에 사용할 언어에 따라 메모리에 영향을 미칩니다.

예를 들어이 특정 심볼의 경우 : 다음 심볼에 사용할 여분의 바이트가 2 개이므로 UTF16 인코딩이 더 효율적입니다. 그러나 일본 알파벳에 UTF16을 사용해야한다는 의미는 아닙니다.

버퍼에서 읽기

위의 바이트를 읽으려면 어떤 인코딩으로 작성되었는지 알고 올바르게 다시 디코딩해야합니다.

이를 디코딩하는 경우 예를 들면 : 00,000,000 11,100,011 10,000,001 10,000,010 UTF16 인코딩에, 당신은으로 끝날 것 없다

참고 : 인코딩과 유니 코드는 서로 다른 두 가지입니다. 유니 코드는 각 기호가 고유 한 코드 포인트에 매핑 된 큰 (테이블) 입니다. 예를 들어, 기호 (문자)는 (코드 포인트) : 30 42 (16 진수)입니다. 반면 인코딩은 하드웨어에 저장할 때 기호를보다 적절한 방식으로 변환하는 알고리즘입니다.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

여기에 이미지 설명을 입력하십시오


아주 좋은 관련 기사, 희망적으로 계속 활성화
yolob

0

UTF-8 은 8 비트 시퀀스를 사용하여 유니 코드 문자를 인코딩하는 방법입니다.

유니 코드 는 여러 언어의 다양한 문자를 나타내는 표준입니다.


4
"8 비트 시퀀스"…? 더 정확하게 지정하고 싶을 수도 있습니다…
deceze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.