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

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

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

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

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



답변

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

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

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

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

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


답변

이상하게도, 아무도 하나의 유니 코드 문자를 취하는 바이트 수를 계산하는 방법을 지적하지 못했습니다. 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 바이트가 걸리며 얼마나 많은 바이트를 차지하는지 나타냅니다.


답변

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

내가 아는 한 오래된 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

알았어 내가 도망 가고있어

재미있는 사실:


답변

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

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

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

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

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


답변

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가 할 수있는 것의 절반.


답변

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

분음 부호가없는 영어 문장의 경우 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과 같은 유니 코드의 특정 인코딩이 아니라 “유니 코드”에 대한 답변이 얼마나 복잡한지를 보여줍니다.

답변

UTF-8로 문자열의 바이트를 계산하는 훌륭한 도구가 있습니다 : http://mothereff.in/byte-counter

업데이트 : @mathias는 코드를 공개했습니다 : https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js