문제

나는 사람들로부터 상충되는 의견을 들었습니다. Wikipedia UTF-8 페이지.

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

도움이 되었습니까?

해결책

다른 사람들이 주신 답변을 확장하기 위해.

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

컴퓨터는 바이트와 같은 숫자를 다루고 ... 여기에서 약간의 기록을 건너 뛰고 메모리 주소 지정 문제를 무시하고, 8 비트 컴퓨터는 하드웨어에서 쉽게 표현되는 가장 큰 수치 장치가 확장 될 때 8 비트 바이트를 처리합니다. 두 바이트 등.

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

그러나 하나 이상의 언어에서 캐릭터를 대표하고 싶을 때는 충분하지 않으므로 사용 가능한 모든 캐릭터를 단일 바이트에 넣는 것은 작동하지 않습니다.

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

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

멀티 바이트 인코딩 (위의 설명 후 다중 단위를 말해야 함)은 비교적 공간 효율적이라는 이점이 있지만, 하위 문자열, 비교 등과 같은 작업은 문자를 유니 코드로 디코딩해야합니다. 이러한 작업을 수행하기 전의 포인트 (일부 바로 가기가 있음).

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

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

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

세부 사항을 채우기를 바랍니다.

다른 팁

"유니 코드"는 불행히도 컨텍스트에 따라 다양한 방식으로 사용됩니다. 가장 올바른 사용 (IMO)은 코딩 된 문자 세트 - 즉 캐릭터 세트와 캐릭터와 정수 사이의 매핑 코드 포인트 그들을 대표합니다.

UTF-8 캐릭터 인코딩입니다. 바이트 시퀀스에서 일련의 문자로 변환하는 방법입니다. 유니 코드 문자 세트 전체를 다룹니다. ASCII는 문자 당 단일 바이트로 인코딩되며, 다른 문자는 정확한 코드 포인트 (현재 정의 된 모든 코드 포인트에 대해 최대 4 바이트, 즉 U-0010ffff까지 최대 4 바이트)에 따라 더 많은 바이트를 가져옵니다. U-001fffff).

"유니 코드"가 문자 인코딩의 이름으로 사용되는 경우 (예 : .NET로서 인코딩 .uNicode 재산) 일반적으로 의미합니다 UTF-16, 가장 일반적인 문자를 두 바이트로 인코딩합니다. 일부 플랫폼 (특히 .NET 및 Java)은 UTF-16을 "기본"문자 인코딩으로 사용합니다. 이것은 단일 UTF -16 값으로 인코딩 할 수없는 문자에 대해 걱정 해야하는 경우 털이 많은 문제로 이어집니다 ( "대리 쌍"으로 인코딩 됨). 그러나 대부분의 개발자는 IME에 대해 걱정하지 않습니다.

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

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

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

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

그것들은 같은 것이 아닙니다 - UTF -8은 유니 코드를 인코딩하는 특별한 방법입니다.

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

유니 코드 만 정의합니다 코드 포인트, 즉, 캐릭터를 나타내는 숫자입니다. 이러한 코드 포인트를 메모리에 저장하는 방법은 부호화 당신이 사용하고있는 것. UTF-8은 다른 많은 것 중에서 유니 코드 문자를 인코딩하는 한 가지 방법입니다.

유니 코드 ISO/IEC 10646과 함께 정의하는 표준입니다. 유니버설 캐릭터 세트 (UCS) 이것은 실질적으로 알려진 모든 언어를 나타내는 데 필요한 모든 기존 문자의 첨부입니다.

유니 코드는 이름과 숫자를 할당합니다 (문자 코드, 또는 코드 포인트) 레퍼토리의 각 캐릭터에.

UTF-8 인코딩, 컴퓨터 메모리에서 이러한 문자를 디지털 방식으로 표현하는 방법입니다. UTF-8은 각 코드 포인트를 일련의 옥셋 (8 비트 바이트)에 맵핑합니다.

예를 들어,

UCS 캐릭터 = 유니 코드 한 문자

UCS 코드 포인트 = U+24B62

UTF-8 인코딩 = F0 A4 AD A2 (HEX) = 11110000 10100100 10101101 10100010 (빈)

유니 코드 캐릭터 세트를 정의하는 표준 일뿐입니다.UCS) 및 인코딩 (UTF)이 문자 세트를 인코딩합니다. 그러나 일반적으로 유니 코드는 표준이 아닌 문자 세트로 표시됩니다.

읽다 모든 소프트웨어 개발자가 절대적으로 절대적으로 최소한, 유니 코드 및 문자 세트에 대해 긍정적으로 알아야합니다 (변명 없음!) 그리고 5 분 안에 유니 코드.

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

유니 코드입니다 기준 그로 인해 문자가 코드 포인트에 매핑됩니다.
각 캐릭터에는 고유 한 CodePoint (식별 번호)가 있으며 9731과 같은 숫자입니다.

UTF-8입니다 그만큼 부호화 코드 포인트의.
디스크에 모든 문자를 저장하려면 (파일에) UTF-8은 문자를 최대 4 옥트 (8 비트 시퀀스)-바이트로 나눕니다. UTF-8은 여러 인코딩 중 하나입니다 (데이터를 나타내는 방법). 예를 들어, 유니 코드에서 (소수) CodePoint 9731은 눈사람을 나타냅니다 (), UTF-8의 3 바이트로 구성된) : E2 98 83

여기에 있습니다 임의의 예제와 함께 정렬 된 목록.

1. 유니 코드

"$, h, a, t,?, 张, 1, =,+..."와 같은 전 세계에는 많은 캐릭터가 있습니다.

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

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

표준은 다음과 같습니다.

  • 각 위치를 "코드 포인트"또는 "코드 위치"라고하는 양식을 만듭니다.
  • 전체 위치는 u+0000에서 U+10ffff까지입니다.
  • 지금까지 일부 위치에는 캐릭터로 가득 차 있으며 다른 위치에는 저장되거나 비어 있습니다.
  • 예를 들어, "u+0024"위치는 문자 "$"로 채워집니다.

추신 : 물론 ISO라는 다른 조직이 다른 표준을 유지하는 다른 표준 인 "ISO 10646"이라는 다른 조직이 있습니다.

2. UTF-8

위와 같이, U+0024는 단지 위치 일 뿐이므로 컴퓨터에서 "$"를 위해 "u+0024"를 저장할 수 없습니다.

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

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

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

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

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

"... 어떤 사람들은 유니 코드가 단순히 각 캐릭터가 16 비트를 가져가는 16 비트 코드라는 오해를 받고 있습니다. 따라서 65,536 개의 가능한 문자가 있습니다. 실제로는 정확하지 않습니다. 유니 코드에 대한 가장 일반적인 신화입니다. , 그렇게 생각한다면 기분이 나쁘지 않습니다.

실제로 유니 코드는 캐릭터에 대해 다른 사고 방식을 가지고 있으며, 사물에 대한 유니 코드 생각 방식을 이해해야합니다.

지금까지 우리는 디스크 또는 메모리에 저장할 수있는 일부 비트에 문자가지도를 맵핑한다고 가정했습니다.

A-> 0100 0001

유니 코드에서 문자는 여전히 이론적 인 개념 인 코드 포인트라고하는 것입니다. 해당 코드 포인트가 메모리 나 디스크에 표시되는 방법은 완전히 다른 이야기입니다 ... "

"... 모든 알파벳의 모든 플라톤 문자는 다음과 같이 작성된 유니 코드 컨소시엄에 의해 마법의 숫자가 할당됩니다. U+ 0639.이 마법 번호는 코드 포인트라고합니다. U+는"유니 코드 "를 의미하며 숫자는 16 진수입니다. U+0639는 아랍어 편지입니다. 영어 편지 A는 U+0041입니다 .... "

"... 좋아요, 우리에게 줄이 있다고 말합니다.

안녕하십니까

유니 코드 에서이 다섯 가지 코드 포인트에 해당합니다.

U+0048 U+0065 U+006C U+006C U+006f.

코드 포인트 만 있습니다. 숫자, 정말. 우리는 이것을 메모리에 저장하거나 이메일 메시지로 표현하는 방법에 대해 아직 아무 말도하지 않았습니다 ... "

"... 그것이 인코딩이 들어오는 곳입니다.

유니 코드 인코딩에 대한 최초의 아이디어는 두 바이트에 대한 신화로 이어졌으며, 그 숫자를 각각 두 바이트로 저장합시다. 그래서 안녕하십니까 becomes

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

오른쪽? 그렇게 빠르지 않습니다! 그것은 또한 다음과 같을 수 없었습니다.

48 00 65 00 6c 00 6c 00 6f 00? ... ""

유니 코드 130,000 개가 넘는 문자를 정의하고 각 숫자 코드 ( "CodePoint")를 할당하는 광범위한 표준입니다. 또한이 텍스트를 정렬하고 정규화하고 사례를 변경하는 방법에 대한 규칙을 정의합니다. 유니 코드의 문자는 0x10ffff까지의 코드 포인트로 표시되지만 일부 코드 포인트는 예약되어 있으며 문자에는 사용할 수 없습니다.

유니 코드의 코드는 둘 이상의 인코딩으로 표시 될 수 있습니다. 가장 간단한 것은 UTF-32이며, 단순히 코드 포인트를 32 비트 정수로 인코딩하고 각각 4 바이트는 4 바이트입니다.

UTF-8 또 다른 인코딩이며, 빠르게 현지 표준이됩니다. 바이트 값 시퀀스로 인코딩합니다. 각 코드 포인트는 이러한 바이트의 가변 수를 사용할 수 있습니다. ASCII 범위의 코드 포인트는 ASCII와 호환되도록 베어로 인코딩됩니다. 이 범위를 벗어난 코드 포인트는 어떤 범위에 있는지에 따라 2, 3 또는 4의 변수 수를 사용합니다.

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

  • ASCII 문자열은 ASCII에서와 같이 정확하게 인코딩되므로 ASCII 문자열도 UTF-8으로 유효합니다.

  • 바이너리 정렬 : 순진한 바이너리 정렬을 사용하여 UTF-8 문자열 분류는 여전히 모든 코드 포인트가 수치 순서로 정렬됩니다.

  • ASCII 범위 외부의 문자는 ASCII 범위의 바이트를 사용하지 않으므로 ASCII 문자로 오인 할 수 없습니다. 이것은 또한 보안 기능입니다.

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

  • 무작위 액세스 : UTF-8 문자열의 어느 시점에서든 해당 위치의 바이트가 캐릭터의 첫 바이트인지 아닌지를 알 수 있고, 어떤 것도 언급 할 필요없이 해당 위치의 바이트가 캐릭터의 첫 바이트인지 아닌지를 알 수 있습니다. 문자열의 시작.

그들은 똑같지 않습니까?

아니, 그들은 그렇지 않습니다.


나는 첫 문장을 생각한다 Wikipedia 페이지 참조 된 간단한 요약을 제공합니다.

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

자세히 설명하기 :

  • 유니 코드 a를 정의하는 표준입니다 문자에서까지 숫자, 소위 코드 포인트, (아래 예에서와 같이). 전체 매핑을 위해서는 살펴볼 수 있습니다. 여기.

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


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

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

유니 코드 많은 언어의 다양한 캐릭터를 대표하는 표준입니다.

이 스레드에서 수집 한 내용을 요약 할 수 있다면 :

유니 코드 '번역' 서수 숫자로의 문자 (10 진수 형태).

à = 224

UTF-8은 '번역'인코딩입니다. 이 숫자는 바이너리에 있습니다 표현.

224 = 11000011 10100000
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top