영어 문자가 다른 알파벳보다 적은 바이트를 필요로하는 이유는 무엇입니까?


31

텍스트 파일에 'a'를 넣으면 2 바이트가되지만 아르메니아 알파벳의 문자 인 'ա'라고하면 3 바이트가됩니다.

컴퓨터 알파벳의 차이점은 무엇입니까?
왜 영어는 더 적은 공간을 차지합니까?


22
이 기사는 StackExchange의 설립자가 작성해야합니다. joelonsoftware.com/articles/Unicode.html
Eric Lippert

22
나는 "영어 문자"와 같은 것이 없다고 생각합니다. 그들은 로마입니다.
Raphael

5
@Raphael은 모두 그가 무엇을 말하는지 알고 있습니다. 그러나 좋은 추가.
Mathias Lykkegaard Lorenzen

1
@Raphael 실제로 영어로 사용되지 않아 ASCII 문자 집합에 포함되지 않은 많은 로마 문자가 있습니다. 대부분 수정자를 포함하지만 영어 이외의 다양한 라틴어 파생 언어로 텍스트를 올바르게 렌더링하려면 여전히 수정자가 필요합니다.
Wutaz

7
@Raphael 저는“로마자”와 같은 것이 없다고 생각합니다. 그들은 라틴어입니다.
Blacklight Shining

답변:


41

주류 컴퓨터에서 사용하도록 개발 된 첫 번째 인코딩 체계 중 하나는 ASCII ( American Standard Code for Information Interchange ) 표준입니다. 그것은 1960 년대 미국에서 개발되었습니다.

영어 알파벳은 라틴 알파벳의 일부를 사용합니다 (예를 들어 영어에는 악센트 부호가있는 단어가 거의 없음). 알파벳을 제외한 26 개의 개별 문자가 있습니다. 또한 영어 알파벳을 인코딩하는 척하는 체계에는 개별 숫자와 문장 부호가 있어야합니다.

1960 년대는 또한 컴퓨터에 현재 보유한 메모리 나 디스크 공간이 없었던시기였습니다. ASCII는 모든 미국 컴퓨터에서 기능적 알파벳의 표준 표현으로 개발되었습니다. 당시 모든 ASCII 문자를 8 비트 (1 바이트) 길이로 만드는 것은 시간에 대한 기술적 세부 사항으로 인해 내려진 결정입니다 (위키 백과 기사는 천공 테이프가 한 번에 한 위치에 8 비트를 유지한다는 사실을 언급합니다). 실제로 원래 ASCII 체계는 7 비트를 사용하여 전송할 수 있으며 8 개는 패리티 검사에 사용될 수 있습니다. 이후의 개발은 몇 가지 악센트, 수학 및 터미널 문자를 포함하도록 원래 ASCII 체계를 확장했습니다.

최근 전 세계에서 컴퓨터 사용량이 증가함에 따라 점점 더 많은 언어를 사용하는 사람들이 컴퓨터에 액세스했습니다. 즉, 각 언어마다 다른 체계와 독립적으로 새로운 인코딩 체계를 개발해야했으며 이는 다른 언어 터미널에서 읽을 경우 충돌 할 수 있습니다.

유니 코드 는 가능한 모든 의미있는 문자를 하나의 추상 문자 세트로 병합함으로써 다른 터미널의 존재에 대한 솔루션으로 제공되었습니다.

UTF-8 은 유니 코드 문자 집합을 인코딩하는 한 가지 방법입니다. 가변 너비 인코딩 (예 : 문자마다 크기가 다를 수 있음)이며 이전 ASCII 체계와의 역 호환성을 위해 설계되었습니다. 따라서 ASCII 문자 세트는 1 바이트로 유지되고 다른 문자는 2 바이트 이상으로 유지됩니다. UTF-16은 유니 코드 문자 집합을 인코딩하는 또 다른 방법입니다. UTF-8과 비교하여 문자는 하나 또는 두 개의 16 비트 코드 단위로 인코딩됩니다.

주석에서 언급했듯이 'a'문자는 단일 바이트를 차지하고 'ա'는 2 바이트를 차지하며 UTF-8 인코딩을 나타냅니다. 귀하의 질문에 추가 바이트는 끝에 개행 문자 (OP가 발견 한)가 있기 때문입니다.


26
일반적인 인코딩이나 파일 형식으로 파일 끝을 코딩하는 마지막 바이트는 없습니다. 프로그램이 파일을 읽을 때 파일 끝은 OS에서 특별한 방식으로 신호를 보낼 수 있지만 이는 다른 문제입니다.
Jukka K. Korpela

2
ա 문자는 UTF-8 버전의 유니 코드에서 2 바이트 (0xD5A1)입니다. 여분의 문자 (무엇이든)는 두 파일에 모두 존재합니다. marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
Dan Neely

6
@khajvah echo 'ա' > file.txt편집하거나 일부 편집기를 사용하여 파일을 편집하면 자동으로 줄 바꿈이 추가됩니다. 을 실행 xxd file.txt하면 마지막 바이트가 아마 0a, 또는 줄 바꿈 일 것입니다.
Daniel Beck

7
@ DoktoroReichard : 답은 유니 코드가 인코딩 이 아님 을 분명히하십시오 . 오히려 추상 문자 세트이며 UTF-16 및 UTF-8은 유니 코드 코드 포인트의 인코딩입니다. 대답의 마지막 단락은 주로 UTF-8에 대해 이야기합니다. 그러나 파일이 UTF-16을 사용하는 경우 모든 코드 포인트, 심지어 하나의 코드 포인트 a는 2 바이트 (또는 2의 배수)를 사용합니다.
grawity

6
또한 "확장 ASCII"문자 세트가 실제로 ASCII가 아니라는 점을 강조 할 가치가 있으며 여덟 번째 비트를 활용하는 다양한 방법으로 인해 큰 혼란이 발생합니다. 대신 UTF-8을 사용하십시오.
ntoskrnl

17

1 바이트는 8 비트이므로 최대 256 개의 (2 ^ 8) 다른 값을 나타낼 수 있습니다.

이보다 더 많은 가능성이 필요한 언어의 경우 간단한 1 대 1 매핑을 유지할 수 없으므로 문자를 저장하는 데 더 많은 데이터가 필요합니다.

일반적으로 대부분의 인코딩은 ASCII 문자에 대해 처음 7 비트 (128 값)를 사용 합니다. 8 번째 비트 또는 더 많은 문자에 대해 128 개 이상의 값이 남습니다. . . 악센트 부호가있는 문자, 아시아 언어, 키릴 문자 등을 추가하면 1 바이트가 모든 문자를 유지하기에 충분하지 않은 이유를 쉽게 확인할 수 있습니다.


그래서 여기에 더 많은 공간이 사용되는 이유를 실제로 설명하는 유일한 답변이 있습니다
Félix Gagnon-Grenier

10

UTF-8에서 ASCII 문자 는 1 바이트를 사용하고 다른 문자는 2, 3 또는 4 바이트를 사용합니다.


1
이것이 왜 그런지 자세히 설명해 주시겠습니까? 두 가지 인코딩 방법에 주목하면 질문에 대한 답이 아닙니다.
MaQleod

@MaQleod Unicode는 ASCII를 대체하기 위해 만들어졌습니다. 이전 버전과의 호환성을 위해 처음 128자는 동일합니다. 이 128자는 1 바이트로 표현할 수 있습니다. 추가 문자를 위해 추가 바이트가 추가됩니다.
Jason

나는 알고 있지만 ASCII 문자를 다르게 만드는 것에 대한 질문에 대한 답변의 일부입니다. OP에 설명해야합니다.
MaQleod

@MaQleod 또한 유니 코드 컨소시엄은 대부분 미국 기업으로 구성되어 있으며 영어 문자에 편향되어 있다고 말할 수 있습니다. 나는 단순한 대답이 주관적인 것보다 낫다고 생각했다.
Jason

15
UTF8에서 "유니 코드로"가 아닌 유니 코드 문자 집합의 여러 인코딩 중 하나 일뿐입니다.
Sebastian Negraszus

3

문자 (질문이 분명한)에 필요한 바이트의 양은 문자 인코딩에 따라 다릅니다. ArmSCII 인코딩을 사용하는 경우 각 아르메니아 문자는 1 바이트 만 차지합니다. 그러나 요즘에는 좋은 선택이 아닙니다.

유니 코드 용 UTF-8 전송 인코딩에서 문자에는 다른 바이트 수가 필요합니다. 여기서 "a"는 1 바이트 만 사용하고 (2 바이트에 대한 아이디어는 혼동의 일종 임), "á"는 2 바이트를 사용하며 아르메니아 문자 ayb "ա"도 2 바이트를 사용합니다. 3 바이트는 일종의 혼란이어야합니다. 반면 벵골어 문자 "অ"은 UTF-8에서 3 바이트를 사용합니다.

배경은 단순히 UTF-8이 Ascii 문자에 대해 매우 효율적으로 설계되었으며 유럽 및 주변 환경에서 시스템을 작성하는 데 상당히 효율적이며 나머지는 덜 효율적입니다. 이는 기본 라틴 문자 (영어 텍스트가 주로 구성되는 문자)이며 문자에는 1 바이트 만 필요합니다. 그리스어, 키릴 자모, 아르메니아어 및 기타 몇 개의 경우 2 바이트가 필요합니다. 나머지는 모두 더 필요합니다.

UTF-8은 (주석에서 지적했듯이) Ascii 데이터 (8 비트 단위로 표현되었을 때 거의 유일한 방법 임)가 UTF-8로 인코딩된다는 유용한 속성도 가지고 있습니다.


응답 해주셔서 감사합니다. 추가 바이트는 내가 사용한 프로그램이 줄 바꿈 문자를 자동으로 추가했기 때문에 발생합니다.
khajvah

1
UTF-8은 ASCII 데이터의 효율성호환성 을 위해 너무 많이 설계된 것으로 생각하지 않습니다 . UTF-8은 7 비트 ASCII 컨텐츠 (높은 비트가 0으로 설정 됨)가 UTF-8과 인코딩 된 동일한 컨텐츠와 동일하다는 매우 좋은 특성을 가지므로 일반적으로 ASCII를 처리하는 도구의 경우 대체 대체품입니다. . 다른 유니 코드 인코딩 체계에는 그 속성이 없습니다. UTF-8은 특히 유니 코드 BMP 영역 내에 머무르는 경우 대부분의 데이터에 대해 상당히 컴팩트합니다 .
CVn

1
@ MichaelKjörling, 그 기능에 대한 참조를 추가했습니다. 그러나 초기 유니 코드에 대한 반대 의견은 비효율적이며 UTF-16은 주로 Ascii 데이터의 크기를 두 배로 늘 렸습니다. UTF-8은 영어 텍스트와 같이 사용하는 비 ASCII 문자에 대해서만 "지불"한다는 것을 의미합니다.
Jukka K. Korpela

3

1960 년대의 문자 코드는 기계마다 다릅니다. 1980 년대에 나는 문자 인코딩 당 36 비트 워드와 5, 6, 8 ( IIRC ) 비트를 가진 DEC 2020 머신을 간단히 사용했다 . 그 전에는 EBCDIC과 함께 IBM 370 시리즈를 사용했습니다. 7 비트 ASCII를 사용하면 순서가 바뀌었지만 기본 메뉴를 페인트하는 모든 상자 그리기 메뉴 및 라틴 -1 (8 비트)과 같은 ASCII 확장과 같은 추가 문자를 표시하기 위해 8 비트를 모두 사용하는 IBM PC "코드 페이지"에 혼란이있었습니다. ASCII와 "국가 문자"와 같은 위해 다른 반처럼 처음 7 비트 인코딩, ñ, Ç, 또는 다른 사람. 아마도 가장 인기있는 라틴 문자를 사용하여 영어와 대부분의 유럽 언어에 맞게, 라틴-1이었다 (그리고 악센트와 변형).

영어와 스페인어 같은 텍스트 믹싱은 훌륭했지만 (라틴어 -1, 둘 다의 슈퍼 셋 사용) 다른 인코딩을 사용하는 모든 것을 믹싱하는 것 (예 : 일본어와 같은 아시아 언어는 말할 것도없고 그리스어 나 러시아어를 포함) 진정한 악몽. 러시아와 특히 일본과 중국이 인기 있고 완벽하게 호환되지 않는 인코딩을 가지고 있다는 것이 최악이었습니다.

오늘날 우리는 영어 문자를 선호하는 UTF-8과 같은 효율적인 인코딩에 중점을 둔 유니 코드를 사용합니다 (놀랍게도 영어 문자의 인코딩은 ASCII에 해당합니다). 영어가 아닌 많은 문자가 더 긴 인코딩을 사용합니다.


2

하나의 'a'가있는 Windows 8.1 US / English 파일은 메모장과 함께 저장됩니다.

  • ANSI 1 바이트로 저장
  • 유니 코드 4 바이트로 저장
  • UTF-8 4 바이트로 저장

메모장과 함께 저장된 단일 'ա'가있는 파일

  • ANSI로 저장 불가
  • 유니 코드 4 바이트로 저장
  • UTF-8 5 바이트로 저장

단일 'a'는 ANSI에서 단일 바이트로 인코딩되며, 유니 코드에서 각 문자는 일반적으로 2 바이트이며 파일 시작 부분에 2 바이트 BOM (Byte Order Marker)도 있습니다. UTF-8에는 3 바이트 BOM과 단일 바이트 문자가 있습니다.

'ա'의 경우 해당 문자가 ANSI 문자 세트에 존재하지 않으며 내 컴퓨터에 저장할 수 없습니다. 유니 코드 파일은 이전과 동일하며 UTF-8 파일은 문자가 2 바이트를 차지하므로 1 바이트 더 큽니다.

기계가 다른 지역에있는 경우 ASCII 범위에서 255 자에 대해 다른 글리프가있는 다른 OEM 코드 페이지가 설치되어있을 수 있습니다. @ntoskrnl에서 언급했듯이 내 컴퓨터의 OEM 코드 페이지는 미국 영어의 기본값 인 Windows-1252입니다.


4
메모장 (및 일반적으로 Windows)은 여기에 혼동되는 용어를 사용합니다. "ANSI"는 로캘 종속 단일 바이트 인코딩 (영문 버전의 Windows-1252)이며 "유니 코드"는 UTF-16입니다.
ntoskrnl

@ntoskrnl 맞습니다. 그러나 인코딩 드롭 박스에서 ANSI라고 표시하면 다른 OEM 코드 페이지가 있으면 다른 결과를 얻을 수 있다고 언급 한 것입니다.
Darryl Braaten

2

문자 저장 방법에 관심이 있으시면 www.unicode.org로 이동하여 둘러보십시오. 메인 페이지 상단에는 유니 코드에서 사용 가능한 모든 문자 코드를 표시하는 "코드 차트"링크가 있습니다.

대체로 유니 코드로 사용 가능한 백만 개가 넘는 코드가 있습니다 (모두 사용되지는 않음). 1 바이트는 256 개의 다른 값을 보유 할 수 있으므로 가능한 모든 유니 코드 코드를 저장하려면 3 바이트가 필요합니다.

대신 유니 코드는 일반적으로 "UTF-8"인코딩으로 저장되며 일부 문자에는 더 적은 바이트를 사용하고 다른 문자에는 더 많은 바이트를 사용합니다. 처음 128 개의 코드 값은 단일 바이트에 저장되고, 처음 2048 개의 코드 값은 2 바이트에 저장되고, 65536까지는 3 바이트에 저장되며, 나머지는 4 바이트를 사용합니다. 더 자주 사용되는 코드 값이 더 적은 공간을 차지하도록 배치되었습니다. AZ, az, 0-9 및! @ $ % ^ & * ()-[} {}; ': "|,. / <>? 그리고 1 바이트를 잊어 버린 일부는 거의 모든 영어, 98 % 독일어와 프랑스어 (추측 만 가능)는 문자 당 1 바이트로 저장 될 수 있으며 가장 많이 사용되는 문자입니다 키릴 문자, 그리스어, 히브리어, 아랍어 및 기타 문자는 문자 당 2 바이트를 사용합니다. 인도어, 중국어, 일본어 대부분 , 한국어, 태국어, 수많은 수학 기호, 문자 당 3 바이트로 쓸 수 있습니다. 희귀 한 것 (Linear A 또는 Linear B로 텍스트를 쓰려는 경우 Emojis)에는 4 바이트가 필요합니다.

다른 인코딩은 UTF-16입니다. UTF-8에서 1, 2 또는 3 바이트를 차지하는 모든 것은 UTF-16에서 2 바이트를 사용합니다. 중간에 라틴 문자가 거의없는 중국어 또는 일본어 텍스트가있는 경우 이점이 있습니다.

UTF-8 디자인의 이유 : 다른 디자인에 비해 몇 가지 장점이 있습니다. 그들은:

US-ASCII 문자와의 호환성

합리적인 소형화

자체 동기화 : UTF-8 인코딩의 문자 인 바이트 시퀀스의 일부가 제공되면 문자가 시작되는 위치를 찾을 수 있습니다. 일부 인코딩에서 xy 및 yx는 모두 문자의 유효한 인코딩 일 수 있으므로 시퀀스의 일부가 제공되면 ... xyxyxyxyxyxy ... 어떤 문자가 있는지 알 수 없습니다.

정렬 정확성 : UTF-8로 인코딩 된 문자가 포함 된 문자열을 바이트 값으로 정렬하면 유니 코드 값에 따라 자동으로 올바르게 정렬됩니다.

단일 바이트 코드와 호환 : 단일 바이트 값을 가정하는 대부분의 코드는 UTF-8 인코딩 문자에서 자동으로 올바르게 작동합니다.

내가 잊은 이유도 있습니다.

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