하나의 유니 코드 문자는 몇 바이트입니까?


239

인코딩에 대해 약간 혼란 스럽습니다. 내가 아는 한 오래된 ASCII 문자는 문자 당 1 바이트를 사용했습니다. 유니 코드 문자는 몇 바이트입니까?

하나의 유니 코드 문자가 모든 언어에서 가능한 모든 문자를 포함 할 수 있다고 가정합니다. 맞습니까? 문자 당 몇 바이트가 필요합니까?

그리고 UTF-7, UTF-6, UTF-16 등은 무엇을 의미합니까? 서로 다른 버전의 유니 코드입니까?

유니 코드에 대한 Wikipedia 기사를 읽었 지만 매우 어렵습니다. 나는 간단한 대답을 기대하고 있습니다.



15
죄송합니다. 간단한 답변이 없습니다. 나는 모든 것을 약간 엉망으로 생각합니다. 유니 코드는 2 바이트를 사용하고 모든 문자를 나타낼 수 있다고 청구되었지만 2 바이트로는 충분하지 않습니다.
Jonathan Wood

12
"간단한 대답": 유니 코드 문자는 1-4 바이트를 사용합니다. 유니 코드는 많은 언어를 다루지 만 전부는 아닙니다. 마지막으로, 예를 들어 Klingon은 공식 유니 코드 문자 집합이 아니 었습니다.
Peter G.

9
Klingon은 유니 코드 표준 자체의 일부가 아닙니다. 대신 Uniode의 개인 사용 영역 (U + F8D0-U + F8FF)을 사용합니다.
Remy Lebeau

1
구주 질문-감사합니다. 내 상황은 SCORM 1.2 호환 LMS를 통해 데이터를 저장하는 중입니다 ... SCORM 1.2 'cmi.suspend_data'의 표준은 이전 개발자가 4096자를 저장할 수 있다고 가정 한 4096 바이트의 데이터입니다. 오, 그가 틀렸어-방금 긴 코스에서 우리의 북마크가 실패하는 이유를 발견했습니다. 따라서 UTF-8을 사용하고 있기 때문에 문자 당 4 바이트가 걸리므로 1024 문자가 필요합니다.
danjah

답변:


147

간단한 답변이 없기 때문에 표시되지 않습니다.

첫째, 유니 코드에는 "모든 언어의 모든 문자"가 포함되어 있지 않지만 반드시 시도해야합니다.

유니 코드 자체는 매핑이며 코드 포인트를 정의하고 코드 포인트는 일반적 으로 문자 와 연관된 숫자 입니다. 나는 문자 결합과 같은 개념이 있기 때문에 일반적으로 말합니다. 악센트 또는 움라우트와 같은 것에 익숙 할 수 있습니다. 그것들은 새로운 논리 문자를 생성하기 위해 a또는 a 와 같은 다른 문자와 함께 사용될 수 있습니다 u. 따라서 문자는 하나 이상의 코드 포인트로 구성 될 수 있습니다.

컴퓨팅 시스템에 유용하려면이 정보에 대한 표현을 선택해야합니다. 이것들은 utf-8, utf-16le, utf-32 등과 같은 다양한 유니 코드 인코딩입니다. 그것들은 코드 단위의 크기에 의해 크게 구별됩니다. UTF-32는 가장 간단한 인코딩이며 32 비트 코드 단위를 사용하므로 개별 코드 포인트가 코드 단위에 편안하게 맞습니다. 다른 인코딩에는 코드 포인트에 여러 코드 단위가 필요하거나 특정 코드 포인트를 인코딩에 전혀 표시 할 수없는 상황이 있습니다 (예 : UCS-2의 문제).

문자 결합의 유연성으로 인해 주어진 인코딩 내에서도 문자 당 바이트 수는 문자 및 정규화 형식에 따라 달라질 수 있습니다. 이것은 둘 이상의 표현을 가진 문자를 처리하기위한 프로토콜입니다 (둘 중 하나는 "an 'a' with an accent"결합 문자이거나 "accented 'a'"하나는 하나의 코드 포인트 임).


1
확인. 그렇다면 하나의 주어진 코드 포인트에서 하나의 주어진 문자를 나타내는 바이트 수는 몇 개입니까? 예를 들어, 비 분리 공간입니다.
Nicolas Barbulesco

결합 문자는 UTF8 배열에서 strlen (), substr () 및 기타 문자열 조작 함수를 작성할 때 프로그래머의 삶을 지옥으로 만듭니다. 이런 종류의 작업은 결코 완료되지 않으며 항상 버그가 있습니다.
Nulik

필자는 각 인코딩으로 해석 된 Windows-1252, UTF8 및 UTF8-BOM 인코딩 파일을 보여주는 결과를 보여주고 결과 간의 동등성을 비교하는 데모를 작성했습니다. github.com/vladyrn/encodings_demo
Vlad

195

이상하게도, 아무도 하나의 유니 코드 문자를 취하는 바이트 수를 계산하는 방법을 지적하지 못했습니다. UTF-8로 인코딩 된 문자열의 규칙은 다음과 같습니다.

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation byte: one of 1-3 bytes following the first
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF7   First byte of a 4-byte character encoding

따라서 빠른 대답은 첫 번째 바이트에 따라 1 ~ 4 바이트가 걸리며 얼마나 많은 바이트를 차지하는지 나타냅니다.


8
4 바이트 문자의 최대 16 진수 값은 0xF7 (0xF4 아님)이라고 생각합니다.
DJPJ

정말 고맙습니다! 나는 IETF 표준을 통해 제어 + f'ing하고 있었고 인코딩에 대해 아무것도 찾지 못했습니다. 읽고있는 기사는 후행 코드 수를 나타내는 데 사용되는 비트 수를 알려주기에는 충분하지 않습니다. "문자"당 포인트.
MarcusJ

1
이것은 이제 "새로운 팀 멤버를위한 소개"치트 시트의 두 번째 페이지와 함께 재미있는 첫 두 개의 코멘트
Cee McSharpface

1
0xF4는 실수가 아니라 설명이었습니다. 유니 코드 코드 포인트는 0-0x10ffff 범위에 있으므로 마지막 코드 포인트는 F4 8F BF BF로 코딩됩니다.
Frediano Ziglio

38

나는이 질문이 오래되어 이미 받아 들여진 대답을 알고 있지만 몇 가지 예를 제시하고 싶습니다 (누군가에게 유용 할 것입니다).

내가 아는 한 오래된 ASCII 문자는 문자 당 1 바이트를 사용했습니다.

권리. 실제로 ASCII는 7 비트 인코딩이므로 128 개 코드 (95 개는 인쇄 가능)를 지원하므로 절반 바이트 만 사용합니다 (그렇다면 의미가있는 경우).

유니 코드 문자는 몇 바이트입니까?

유니 코드는 문자를 코드 포인트에 매핑합니다. 인코딩 방법을 정의하지 않습니다. 텍스트 파일은 유니 코드 문자를 포함하지 않지만 유니 코드 문자를 나타내는 바이트 / 옥텟을 포함합니다.

하나의 유니 코드 문자가 모든 언어에서 가능한 모든 문자를 포함 할 수 있다고 가정합니다. 맞습니까?

아뇨.하지만 거의. 기본적으로 그렇습니다. 그러나 여전히 아닙니다.

문자 당 몇 바이트가 필요합니까?

두 번째 질문과 동일합니다.

그리고 UTF-7, UTF-6, UTF-16 등은 무엇을 의미합니까? 그들은 어떤 종류의 유니 코드 버전입니까?

아니요, 인코딩입니다. 바이트 / 옥텟이 유니 코드 문자를 나타내는 방법을 정의합니다.

몇 가지 예. 글꼴이 지원하지 않기 때문에 브라우저에 일부를 표시 할 수없는 경우 http://codepoints.net/U+1F6AA( 1F6AA코드 포인트를 16 진수로 바꾸십시오 )로 이동 하여 이미지를보십시오.

    • U + 0061 라틴 문자 A : a
      • Nº : 97
      • UTF-8 : 61
      • UTF-16 : 00 61
    • U + 00A9 저작권 표시 : ©
      • Nº : 169
      • UTF-8 : C2 A9
      • UTF-16 : 00 A9
    • U + 00AE 등록 표시 : ®
      • Nº : 174
      • UTF-8 : C2 AE
      • UTF-16 : 00 AE
    • U + 1337 민족성 음절 PHWA :
      • Nº : 4919
      • UTF-8 : E1 8C B7
      • UTF-16 : 13 37
    • U + 2014 EM DASH :
      • Nº : 8212
      • UTF-8 : E2 80 94
      • UTF-16 : 20 14
    • 마일 부호 당 U + 2030 :
      • Nº : 8240
      • UTF-8 : E2 80 B0
      • UTF-16 : 20 30
    • U + 20AC 유로 기호 :
      • Nº : 8364
      • UTF-8 : E2 82 AC
      • UTF-16 : 20 AC
    • U + 2122 상표 표시 :
      • Nº : 8482
      • UTF-8 : E2 84 A2
      • UTF-16 : 21 22
    • U + 2603 눈사람 :
      • Nº : 9731
      • UTF-8 : E2 98 83
      • UTF-16 : 26 03
    • U + 260E 검은 색 전화 :
      • Nº : 9742
      • UTF-8 : E2 98 8E
      • UTF-16 : 26 0E
    • 비가 내리는 U + 2614 우산
      • Nº : 9748
      • UTF-8 : E2 98 94
      • UTF-16 : 26 14
    • U + 263A 화이트 스마일 링 얼굴 :
      • Nº : 9786
      • UTF-8 : E2 98BA
      • UTF-16 : 26 3A
    • U + 2691 검은 깃발 :
      • Nº : 9873
      • UTF-8 : E2 9A 91
      • UTF-16 : 26 91
    • U + 269B 원자 기호 :
      • Nº : 9883
      • UTF-8 : E2 9A 9B
      • UTF-16 : 26 9B
    • U + 2708 비행기 :
      • Nº : 9992
      • UTF-8 : E2 9C 88
      • UTF-16 : 27 08
    • U + 271E 흰색 라틴 크로스
      • Nº : 10014
      • UTF-8 : E2 9C 9E
      • UTF-16 : 27 1E
    • U + 3020 우편 마크 얼굴 :
      • Nº : 12320
      • UTF-8 : E3 80 A0
      • UTF-16 : 30 20
    • U + 8089 CJK 통합 IDEOGRAPH-8089 :
      • Nº : 32905
      • UTF-8 : E8 82 89
      • UTF-16 : 80 89
    • POO의 U ​​+ 1F4A9 파일 : 💩
      • Nº : 128169
      • UTF-8 : F0 9F 92 A9
      • UTF-16 : D8 3D DC A9
    • U + 1F680 로켓 : 🚀
      • Nº : 128640
      • UTF-8 : F0 9F 9A 80
      • UTF-16 : D8 3D DE 80

알았어 내가 도망 가고있어

재미있는 사실:


UTF-16 의 코드 단위 는 16 비트입니다. 당신은 중간에 공간을 보여주었습니다. ©의 UTF-16 표현은 00A9대신에 00 A9UTF-16BE가되어야합니다.
Roland Illig

차이점이 뭐야? 빅 엔디 언을 의미하지 않습니까? 그는 빅 엔디안으로 작성 했으므로 빅 엔디안 UTF-16으로 작성된 파일은 UTF-16BE와 동일합니다.
HappyPandaFace 2012 년

6
수정 사항 : 1) ASCII는 7 비트, 바이트는 8 비트이므로 절반보다 훨씬 큽니다. 2) 유니 코드는 코드 포인트를 인코딩하는 방법을 정의합니다. UTF-8, UTF-16 및 UTF-32는 유니 코드 표준에 정의되어 있습니다.
Jonathan Rosenne

3
@JonathanRosenne 나는 그것이 비트의 절반을 사용하는 것이 아니라 8 비트로 표현 가능한 가능한 값의 절반 만 사용한다는 것을 의미한다고 생각합니다.
Aritz Lopez

2
나는 예제를 정말 좋아한다. 예를 들어 UTF-8보다 UTF-16을 선호하는 이유를 강조합니다. 다른 소프트웨어 개발자는 어떤 유니 코드 문자를 사용할 가능성에 따라 다른 인코딩을 선택할 수 있습니다. 예를 들어, 중국 / 일본에서는 UTF-16 (2 바이트)이 UTF-8보다 더 의미가 있습니다. 동일한 문자가 UTF-8로 인코딩하려면 종종 2 배의 바이트가 필요하기 때문입니다.
mike

29

간단히 말하면 Unicode세계의 모든 문자에 하나의 숫자 (코드 포인트)를 할당 한 표준입니다 (아직도 진행 중입니다).

이제 바이트를 사용하여이 코드 포인트를 표시해야합니다 character encoding. UTF-8, UTF-16, UTF-6이러한 캐릭터를 나타내는 방법입니다.

UTF-8멀티 바이트 문자 인코딩입니다. 문자는 1-6 바이트를 가질 수 있습니다 (일부 문자는 현재 필요하지 않을 수 있음).

UTF-32 각 문자는 4 바이트 문자입니다.

UTF-16각 문자에 16 비트를 사용하며 BMP라는 유니 코드 문자의 일부만을 나타냅니다 (모든 실제적인 목적으로 충분 함). Java는이 인코딩을 문자열로 사용합니다.


10
유니 코드는 21 비트 코드 세트이며 UTF-8의 유니 코드 문자를 나타내기에 4 바이트이면 충분합니다. UTF-16은 서로 게이트를 사용하여 BMP (기본 다국어 평면) 외부의 문자를 나타냅니다. 유효한 유니 코드 문자를 나타내려면 2 또는 4 바이트가 필요합니다. UCS-2는 BMP 외부의 대리자 또는 문자를 지원하지 않는 16 비트 UTF-16의 변형입니다.
Jonathan Leffler 2016 년

1
당신이 올바른지. UTF-8 원본은 32 비트를 수용하기 위해 6 바이트였습니다. 그가 이미 wiki doc과 혼동되어있는 상황에서 나는 실제로 일을 복잡하게하고 싶지 않았다 :)
Zimbabao

3
이 답변은 UTF-16이 BMP 코드 포인트를 인코딩 할 수 없음을 나타냅니다. 서로 게이트 쌍을 사용하여 UTF-8로 인코딩 할 수있는 것처럼 인코딩 할 수 있으므로 올바르지 않습니다. (16 비트 코드 포인트 만 인코딩 한 유니 코드 2.0이 나오기 전에 구식 UCS-2를 생각해야합니다.) 또한 Java는 UTF-16을 사용하지 않으며 코드 포인트에서 수정 된 형식을 사용합니다. 0은 다르게 인코딩됩니다.
rdb

@rdb-반대입니다. 대답은 UTF-16이 BMP를 나타냅니다.
Nicolas Barbulesco

3
나는 틀렸다; 나는 "비 BMP"를 말하려고했다. 대답의 오류는 UTF-16이 BMP 문자를 나타내며 정확하지 않다는 것입니다. UTF-16은 모든 유니 코드 문자를 인코딩 할 수 있습니다. BMP 이외의 문자는 서로 게이트 쌍을 통해 인코딩됩니다. 아마도 대답자는 UCS-2와 혼동되었을 것입니다.
rdb

17

UTF-8에서 :

1 byte:       0 -     7F     (ASCII)
2 bytes:     80 -    7FF     (all European plus some Middle Eastern)
3 bytes:    800 -   FFFF     (multilingual plane incl. the top 1792 and private-use)
4 bytes:  10000 - 10FFFF

UTF-16에서 :

2 bytes:      0 -   D7FF     (multilingual plane except the top 1792 and private-use )
4 bytes:   D800 - 10FFFF

UTF-32에서 :

4 bytes:      0 - 10FFFF

10FFFF는 정의에 의한 마지막 유니 코드 코드 포인트이며 UTF-16의 기술적 한계이기 때문에 그렇게 정의됩니다.

또한 UTF-8은 4 바이트로 인코딩 할 수있는 가장 큰 코드 포인트이지만 UTF-8 인코딩의 기본 개념은 5 및 6 바이트 인코딩에서도 작동하여 7FFFFFFF까지 코드 포인트를 처리합니다. UTF-32가 할 수있는 것의 절반.


8

유니 코드에서는 대답이 쉽게 제공되지 않습니다. 이미 지적했듯이 문제는 인코딩입니다.

분음 부호가없는 영어 문장의 경우 UTF-8에 대한 답은 문자 수만큼 바이트이고 UTF-16의 경우 2 배의 문자 수입니다.

크기에 대한 진술을 할 수있는 유일한 인코딩은 현재 UTF-32입니다. 코드 포인트가 향후 UTF-64를 위해 준비되었다고 생각하더라도 문자 당 항상 32 비트입니다. :)

그것을 어렵게 만드는 것은 적어도 두 가지입니다.

  1. 이미 악센트 / 분음 문자 (À)가있는 문자 엔터티를 사용하는 대신 사용자는 악센트와 기본 문자 (`A)를 결합하기로 결정했습니다.
  2. 코드 포인트. 코드 포인트는 UTF- 인코딩에서 일반적으로 이름에 허용되는 비트 수보다 많은 비트를 인코딩 할 수있는 방법입니다. 예를 들어 UTF-8은 자체적으로 유효하지 않은 특정 바이트를 지정하지만 유효한 연속 바이트가 오는 경우 8 비트 범위 인 0..255 이상의 문자를 설명 할 수 있습니다. 참고 항목 UTF-8에 대한 위키 백과의 문서에서 다음과 너무 긴 인코딩을.
    • 주어진 예는 우수한 € 문자 (코드 포인트가 존재 U+20AC로 어느 나타낼 수 3 바이트 시퀀스 E2 82 AC또는 4 바이트 시퀀스 F0 82 82 AC.
    • 둘 다 유효하며 이는 UTF-8 또는 UTF-16과 같은 유니 코드의 특정 인코딩이 아니라 "유니 코드"에 대한 답변이 얼마나 복잡한지를 보여줍니다.


4

글쎄요, Wikipedia 페이지도 열었습니다. 소개 부분에서 "유니 코드는 다른 문자 인코딩으로 구현 될 수 있습니다. 가장 일반적으로 사용되는 인코딩은 UTF-8 (ASCII 문자에 대해 1 바이트를 사용)입니다. UTF-8과 ASCII 인코딩 모두에서 동일한 코드 값, 그리고 다른 문자의 경우 최대 4 바이트), 현재 사용되지 않는 UCS-2 (각 문자에 2 바이트를 사용하지만 현재 유니 코드 표준의 모든 문자를 인코딩 할 수는 없음) "

이 인용에서 알 수 있듯이 유니 코드는 문자를 인코딩하는 단일 방법이라고 가정합니다. 실제로 여러 형태의 유니 코드가 있으며, 그 인용에서 다시 말하지만, 그중 하나는 익숙한 것과 마찬가지로 문자 당 1 바이트를 갖습니다.

그래서 당신이 원하는 간단한 대답은 다양하다는 것입니다.


3

UTF-16의 경우 문자가 0xD800 이상으로 시작하면 4 바이트 (2 개의 코드 단위)가 필요합니다. 이러한 문자를 "대리 쌍"이라고합니다. 보다 구체적으로, 대리 쌍은 다음과 같은 형식을 갖습니다.

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

여기서 [...]는 주어진 범위의 2 바이트 코드 단위를 나타냅니다. <= 0xD7FF는 하나의 코드 단위 (2 바이트)입니다. > = 0xE000 이상은 유효하지 않습니다 (BOM 마커 제외).

http://unicodebook.readthedocs.io/unicode_encodings.html 섹션 7.5를 참조하십시오 .



1

위키에서 :

ASCII와의 호환성을 최대화하는 8 비트 가변 폭 인코딩 UTF-8;

UTF-16, 16 비트 가변 폭 인코딩;

UTF-32, 32 비트 고정 너비 인코딩

이것들은 가장 널리 사용되는 세 가지 다른 인코딩입니다.

  • UTF-8에서 각 문자는 1-4 바이트로 인코딩됩니다 (주요 인코딩)
  • UTF16에서 각 문자는 1 ~ 2 개의 16 비트 단어로 인코딩되고
  • UTF-32에서 모든 문자는 단일 32 비트 워드로 인코딩됩니다.

1

Unicode모든 문자에 고유 번호를 제공 하는 표준 입니다. 이 고유 번호는 code point세계에 존재하는 모든 문자에 대해 s (단순한 코드 임)라고합니다 (일부는 여전히 추가되어야 함).

다른 목적으로 이것을 code points바이트 단위 로 표현해야 할 수도 있고 (대부분의 프로그래밍 언어가 그렇게 함) 여기에 Character Encoding시작됩니다.

UTF-8, UTF-16, UTF-32등 모두 Character Encodings, 유니 코드의 코드 포인트는 다른 방법으로,이 인코딩에 표시됩니다.


UTF-8 인코딩은 가변 너비 길이를 가지며 인코딩 된 문자는 1-4 바이트를 포함 할 수 있습니다.

UTF-16가변 길이를 가지며 인코딩 된 문자는 1 또는 2 바이트 (8 또는 16 비트)를 사용할 수 있습니다. 이것은 BMP (Basic Multilingual Plane)라고하는 모든 유니 코드 문자의 일부만을 나타내며 거의 모든 경우에 충분합니다. Java는 UTF-16문자열과 문자에 인코딩을 사용 합니다.

UTF-32 길이는 고정되어 있으며 각 문자는 정확히 4 바이트 (32 비트)를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.