UTF-8이 수백만 개의 새로운 문자로 방대한 외계 언어를 포함하도록 지원할 수 있습니까?


86

경우에 외계인의 침공은 문자의 자신의 가능성 방대한 양의 수 있도록하는 방법으로 UTF-8을 설계, 발생 그리고 우리는 우리의 기존 컴퓨터 시스템의 모든 자신의 언어를 지원하기 위해 강제로?

(물론, 우리는 외계인이 실제로 언어를 가지고 있는지, 의사 소통을하는지 또는 어떻게 말하는지 알지 못하지만, 논쟁을 위해, 단지 그들이한다고 상상해보십시오.)

예를 들어, 언어가 수백만 개의 새로 발견 된 글리프, 기호 및 / 또는 문자 조합 으로 구성된 경우 이론적으로 이러한 새로운 글리프를 포함하도록 UTF-8을 끊임 없는 방식으로 확장하여 기존의 모든 소프트웨어를 계속 지원할 수 있습니까?

글리프가 현재 크기 제한을 훨씬 초과하고 단일 글리프를 나타내는 데 더 많은 바이트가 필요한지에 더 관심이 있습니다. UTF-8을 확장 할 수 없는 경우 UTF-32에 비해 단일 이점이 단순히 더 작은 문자 크기라는 것을 증명합니까?


16
" 언어 지원 "(내 강조) ... 얼마나 많은가? 언어를 문자로 나눌 수 있습니까? 어쩌면 언어는 공간 관계에 기초한 것일 수도 있습니다. -테드 치앙 (Ted Chiang) "당신의 삶의 이야기 ", 당신의 삶의 이야기와 다른 것들을보십시오 . 기껏해야 이것은 최대 X-bytes-in-X-bytes 질문입니다 (주제 외). 최악의 경우, 그것은 투기적인 말도 안됩니다. (당신이 무엇을 요구하는지 명확하지 않음)
Scant Roger

6
@ScantRoger 수락 된 답변은 의도 한대로 질문에 답변하는 데 훌륭한 역할을합니다.
Qix

11
수락 된 답변은 UTF-8, UTF-16 및 UTF-32의 사실을 알려주는 훌륭한 일을합니다. Wikipedia에서 간단히 찾을 수 있습니다. "외국인 침략"에 관해서는, 그 대답이 어떻게 해결되는지 전혀 알 수 없습니다.
Scant Roger


9
유니 코드는 언어를 지원하지 않으며 문자를 지원 합니다 -문양으로 의미를 나타내는 데 사용되는 글리프. 많은 인간 언어에는 스크립트가 없으므로 유니 코드로 지원할 수 없습니다. 많은 동물은 말할 것도없고 언어는 가지고 있지 않습니다. 글리프 세트가 유한하지 않기 때문에 일러스트 또는 단어없는 만화에 의한 통신은 유니 코드로 지원할 수 없습니다. 정의상 우리는 외계인이 의사 소통하는 방법을 모르므로 귀하의 질문에 대답하기가 불가능합니다. 유니 코드가 지원할 수있는 고유 문자 수를 알고 싶다면 다음을 분명히해야합니다. :)
JacquesB

답변:


109

유니 코드 표준에는 많은 여유 공간이 있습니다. 유니 코드 코드 포인트는 "평면"및 "블록"으로 구성됩니다. 총 17 개의 비행기 중 현재 11 개의 할당되지 않은 비행기가 있습니다 . 각 비행기는 65,536자를 보유하고 있으므로 외계 언어를 대체하기 위해 실제로 50 만 개의 코드 포인트가 있습니다 (처음 접촉하기 전에 더 많은 그림 이모티콘으로 채우지 않는 한). 유니 코드 8.0부터는 총 120,737 개의 코드 포인트 만 할당되었으며 (총 용량의 약 10 %), 거의 동일한 양이 할당되지 않았지만 개인용 응용 프로그램 전용으로 예약되었습니다. 총 974,530 개의 코드 포인트가 할당되지 않았습니다.

UTF-8은 유니 코드의 특정 인코딩이며 현재 코드 포인트 당 4 옥텟 (바이트)으로 제한되며 UTF-16의 제한과 일치합니다. 특히 UTF-16은 17 개의 평면 만 지원합니다. 이전에는 UTF-8이 코드 포인트 당 6 옥텟을 지원했으며 32768 평면을 지원하도록 설계되었습니다. 원칙적으로이 4 바이트 제한을 해제 할 수는 있지만 현재 유니 코드의 조직 구조를 깨뜨리고 UTF-16을 단계적으로 제거해야합니다. 특정 운영 체제 및 프로그래밍에서 얼마나 강력한 지 고려하면 가까운 미래에 일어날 가능성은 거의 없습니다. 언어.

UTF-16이 여전히 보편적으로 사용되는 유일한 이유는 단일 유니 코드 평면 만 지원하는 결함이있는 UCS-2 인코딩의 확장이기 때문입니다. 그렇지 않으면 UTF-8 (고정 너비 아님)과 UTF-32 (ASCII 호환 아님, 공통 데이터의 공간 낭비)에서 바람직하지 않은 속성을 상속받으며 엔디안을 선언하려면 바이트 순서 표시가 필요합니다. 이러한 문제에도 불구하고 UTF-16은 여전히 ​​인기가 있지만, 이것이 곧 그 자체로 바뀔 것이라고 낙관하지 않습니다. 바라건대, 우리의 새로운 외계인 대 군주들은 그들의 통치에 대한이 장애를 보게 될 것이며 그들의 지혜로 지구의 얼굴에서 UTF-16을 추방 할 것 입니다.


7
실제로 UTF-8은 UTF-16과 일치시키기 위해 4 바이트 제한의 ​​일부로 만 제한됩니다. 특히, 17/32까지는 절반 이상입니다.
중복 제거기

5
Windows 이외의 OS 또는 OS의 대부분의 프로그램이 UTF16을 사용하는 다른 OS는 없습니다. OSX 프로그램은 일반적으로 UTF8, Android 프로그램은 일반적으로 UTF8, Linux는 일반적으로 UTF8입니다. 윈도우 죽을 때까지 그래서 우리가 필요한 것은 (이미 모바일 공간에서 일종의 죽은)입니다
slebetman

23
우리가 처음 연락하기 전에 더 많은 그림 이모티콘을 채우지 않으면 ... 당신은 그것을 가지고 있습니다. 외계인과의 평화로운 상호 작용에 대한 가장 중요한 위협은 이모티콘입니다. 우린 운명이야
rickster

13
@slebetman 실제로는 아닙니다. JVM 기반의 모든 것은 UTF-16을 사용합니다 (Android도 그렇지 않은 이유는 확실하지 않습니다), JavaScript는 UTF-16을 사용하며 Java 및 JavaScript가 가장 인기있는 언어이므로 UTF-16은 언제 어디서나 갈 수 없습니다 곧.
Malcolm

5
@Kaiserludi "대부분의 리눅스 코드는 유니 코드를 위해 UTF32를 사용한다". 도대체 어디서 그 아이디어를 얻었습니까? wfopen syscall이나 다른 것도 없으며 UTF8입니다. 역사적 이유로 인해 문자열을 UTF-16으로 정의하는 Python과 Java조차도 필요한 경우를 제외하고 문자열을 UTF-16으로 저장하지 않습니다. 큰 메모리 이점과 성능 저하가 없으며 변환을 처리하는 추가 코드에도 불구하고- 메모리가 비싸고 CPU가 저렴합니다). 안드로이드도 마찬가지입니다. NDK의 JString은 UTF8입니다. 대부분 Google 엔지니어가 미쳤 기 때문입니다.
Voo

30

UTF-8을 실제로 확장하려면 표현할 수있는 최대 값을 살펴 봐야합니다. UTF-8은 다음과 같이 구성됩니다.

Char. number range  |        UTF-8 octet sequence
   (hexadecimal)    |              (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

(뻔뻔하게 복사 은 RFC에서 .) 우리는 첫 번째 바이트는 항상 많은 후속 바이트는 현재의 문자를 구성하는 방법을 제어 것을 알 수있다.

최대 8 바이트를 허용하도록 확장하면 추가 비 유니 코드 표현이 나타납니다.

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111111 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

이 기술을 통해 가능한 최대 표현 계산

  10000000₂
+ 00100000₂ * 01000000₂
+ 00010000₂ * 01000000₂^2
+ 00001000₂ * 01000000₂^3
+ 00000100₂ * 01000000₂^4
+ 00000010₂ * 01000000₂^5
+ 00000001₂ * 01000000₂^6
+ 00000001₂ * 01000000₂^7

또는 기초 10에서 :

  128
+  32 * 64
+  16 * 64^2
+   8 * 64^3
+   4 * 64^4
+   2 * 64^5
+   1 * 64^6
+   1 * 64^7

최대 표현 량은 4,468,982,745,216입니다.

따라서이 40 억 ( 또는 당신이 좋아하는대로 ) 문자가 외계 언어를 표현하기에 충분하다면, 최소한의 노력으로 현재 UTF-8을 확장하여 새로운 외계인 군주를 기쁘게 할 수 있다고 매우 긍정적입니다.


8
현재 UTF-8은 0x10FFFF까지 코드 포인트로만 제한되지만 UTF-16과의 호환성을 위해서만 사용됩니다. 확장이 필요한 경우 0x7FFFFFFF (2³¹-1)까지 코드 포인트로 확장하는 방법에 대한 모호성이 없습니다. 그러나 그 이상으로 나는 상충되는 정의를 보았다. 내가 본 한 정의 111111xx는 가능한 첫 번째 바이트와 최대 2³² 코드 포인트에 대해 5 개의 확장 바이트를가집니다. 그러나 이는 처음 2³¹ 코드 포인트에 대해 언급 한 정의와 만 호환됩니다.
kasperd

2
예, Wikipedia 는 UTF-16에 대해 말하고 있습니다. 실제로 문맥에 따라 유니 코드 또는 ISO 10646을 의미합니다. 실제로 RFC 3629 이후 UTF-8 U + 10FFFF 이상 (또는 F4 8F BF BFUTF-8 바이트)으로 정의되지 않습니다 . 그래서 제가 그 이상으로 언급 한 것은 순수한 추측입니다. 물론 누군가는 다른 확장을 생각할 수 있습니다. 첫 번째 바이트가 높으면 다음과 같은 다른 구조를 나타냅니다 (그리고 프로세스에서 자체 동기화를 파괴하지 않기를 바랍니다). 그래도 바이트 체계를 가능한 한 실제 UTF-8에 가깝게 완성하려고했습니다.
Boldewyn

4
그것은 4 조가 아니라 4 조입니다.
Ypnypn

1
후속 바이트 수가 항상 첫 번째 바이트의 선행 바이트 수보다 1이 적을 필요는 없습니다. 펄은 실제로 (2000 년 이후) 5, 6, 7 바이트 형식이이 답변과 동일한 UTF-8의 내부 변형을 지원하지만 FF72 비트를 저장할 수있는 13 바이트 코드 단위를 소개합니다. 2 ^ 36을 초과하는 것은 균일하게 매우 비싸지 만 64 비트 int를 인코딩 한 다음 일부를 인코딩 할 수 있습니다.
홉스

7

RFC3629 는 문자 당 최대 4 바이트로 UTF-8을 제한하며 최대 값은 0x10FFFF이며 최대 1,112,064 개의 코드 포인트를 허용합니다. 분명히이 제한은 없어지고 표준이 확장 될 수 있지만,이 제한에 맞는 기존 코드의 주요 변경 사항이 될 것입니다.

데이터 파일 관점에서 볼 때, 각 바이트의 최상위 비트 (MSB)가 설정되면 다음 바이트가 인코딩의 일부라는 기준에 따라 표준이 작동하므로 이는 근본적인 변화가 아닙니다. RFC3629 이전에도 표준은 31 비트로 제한되어 네 번째 바이트의 MSB는 설정되지 않았습니다.

표준을 0x10FFFF 이상으로 확장하면 UTF-8과의 UTF-8 부분 데이터 호환성이 손상됩니다.


5
이론적으로 데이터 는 이전 버전과 호환되지만 코드 는 본질적으로 표준 수정과 호환되지 않습니까?
Qix

2
@ Qix, 그것은 유효한 포인트입니다. 기존 UTF-8 파일은 자연스럽게 수백만 개의 코드 포인트를 수용하기 위해 최대 6 바이트와 호환 가능하지만 UTF-8을 처리하도록 설계된 많은 기존 라이브러리는 해당 확장을 처리하지 못할 수 있습니다.
David Arno

4
UTF-16은 치명적입니다. 기본적으로 최대 0x10FFFF의 코드 포인트 만 지원할 수 있습니다.
gnasher729 2016

1
@ gnasher729 : 생각만큼 큰 문제는 아닙니다. Pre-Unicode는 Shift 값 (Shift JIS for Japanese)을 통해이를 해결했습니다. 예약 / 사용하지 않은 문자 (0xFFFD?)를 "shift character"로 표시하여 인코딩을보다 확장 된 형태로 바꿉니다. 아마도 UTF32입니다.
Mooing Duck

4

실제로 2 개의 유니 코드 코드 포인트 코드 만이 문자를 결합하는 경우 무한히 많은 글리프를 나타냅니다.

예를 들어 한글 알파벳을 유니 코드로 인코딩하는 두 가지 방법 인 한글 음절한글 자모를 비교해보십시오 . 웃은 문자 Hangul Syllabels는 단일 코드 포인트 인 C6C3반면 Hangul Jamo3 개의 코드 포인트 110B(ㅇ) 116E(ㅜ) 11B9(ㅅ)입니다. 분명히 문자 결합을 사용하면 코드 포인트가 크게 줄어들지 만 각 문자를 작성하는 데 더 많은 바이트가 필요하므로 쓰기에 덜 효율적입니다.

이 트릭을 사용하면 현재 UTF-8 또는 UTF-16으로 인코딩 할 수있는 코드 포인트 수를 넘어 설 필요가 없습니다.

나는 그들의 언어가 지상 언어보다 메시지 당 더 많은 바이트를 요구한다면 외계인이 얼마나 기분을 상하게했는지에 달려 있다고 생각합니다. 예를 들어, 문자를 결합하는 100k의 혼란을 사용하여 수백만의 각 문자를 나타내는 것이 마음에 들지 않는다면 아무런 문제가 없습니다. 반면에 지구인보다 더 많은 바이트를 사용해야한다면 2 등 시민으로 느끼게된다면, 우리 는 이미 UTF-8에서 관찰 한 것과는 다른 충돌이 발생할 수 있습니다 .


외계 언어로 된 문자가 실제로 더 제한된 그래프 세트로 구성된 경우에만 해당됩니다. 그렇지 않을 수도 있습니다.
JacquesB

1
내가 아는 한 문자 결합은 개별 그래프와 관련이 필요하지 않습니다. 유니 코드 FAQ 는 이것에 대해서는 침묵하지만, 레이아웃 엔진이 그래 프 시퀀스가 ​​아닌 콤보 시퀀스를 지원하는 것은 더 이상 어렵지 않을 것입니다. 어쨌든 사전 구성된 글리프가 필요하기 때문입니다.
Owen

이 외계인은 얼마나 오래 살며, 어린 시절에 얼마나 많은 문자를 그래 핀으로 분해 할 수 없습니까? 사전 구성된 한글은 gzip 이후에도 분해 된 한글에 비해 바이트 우위를 유지합니까?
Damian Yerrick 2016 년

-2

편집 : 이제 질문에 "수백만 개의 새로운 캐릭터"가 있습니다. 이렇게하면 쉽게 대답 할 수 있습니다.

없음 . Utf-8은 유니 코드 인코딩입니다. 유니 코드에는 1,114,112 개의 고유 한 코드 포인트 를 허용하는 코드 공간 이 있으며 현재 백만 미만도 할당되지 않았습니다. 따라서 유니 코드로 수백만 개의 새로운 문자를 지원할 수 없습니다. 정의상 유니 코드 인코딩은 유니 코드로 정의 된 것보다 많은 문자를 지원할 수 없습니다. (물론 레벨을 더 인코딩하여 부정 행위를 할 수 있습니다. 모든 종류의 데이터는 결국 두 문자로 표현할 수 있습니다.)


원래 질문에 대답하려면 :

유니 코드는 언어를 지원하지 않으며 문자를 지원합니다. 문자를 문자로 표시하는 데 사용됩니다.

모든 사람의 언어로 작성된 표현이있는 것은 아니므로 모든 사람의 언어가 유니 코드로 지원되는 것은 아닙니다. 또한 많은 동물들이 의사 소통을하지만 글을 쓰지 않습니다. 예를 들어, 고래는 언어를 호출하기에는 복잡하지만 서면 형식이없는 통신 형식을 가지고 있습니다 (기존의 음성 표기법으로도 포착 할 수 없음). 따라서 지구상의 모든 언어조차도 유니 코드로 지원할 수있는 것은 아닙니다.

더 나쁜 것은 꿀벌의 언어와 같은 것입니다. 서면 양식이 없을뿐만 아니라 서면 양식으로도 의미가 없습니다. 언어는 기본적으로 어떤 방향을 가리 키지 만 태양의 현재 위치에 의존하는 일종의 춤입니다. 따라서이 춤은 공연이 진행되는 특정 장소와 시간에만 정보를 제공합니다. 상징적 또는 텍스트 표현은 꿀벌의 언어가 현재 표현할 수없는 정보 (태양의 위치, 위치)를 포함해야합니다.

서면 또는 상징적 형태의 커뮤니케이션조차도 유니 코드로 표현하지 못할 수 있습니다. 예를 들어 그림 문자 세트가 유한하지 않기 때문에 일러스트레이션이나 단어없는 만화는 유니 코드에서 지원할 수 없습니다. 공항과 같은 국제적인 환경에서 많은 그림의 커뮤니케이션을 알 수 있으므로 우주 여행 외계인이 그림 언어를 사용하도록 진화했을 것입니다.

외계인 종족이 유한 한 기호 세트를 가진 쓰기 시스템을 가진 언어를 가지고 있더라도이 시스템은 유니 코드로 지원하지 못할 수 있습니다. 유니 코드는 쓰기가 선형 순서의 기호 일 것으로 예상합니다. 음악 표기법은 기호의 선택과 수직 ​​및 수평 배치로 의미가 인코딩되기 때문에 유니 코드로 완전히 표현할 수없는 필기 시스템의 예입니다. (유니 코드는 개별 음악 기호를 지원하지만 점수를 인코딩 할 수는 없습니다.) 다성 음악 (드문 경우는 아님) 또는 유사한 복잡도의 통신 채널을 사용하여 통신 한 외계인 인종은 오케스트라 악보와 같은 필기 시스템을 가지고있을 수 있습니다. 유니 코드는이를 지원할 수 없습니다.

그러나 모든 언어, 심지어 외국어조차도 유한 한 세트로부터 선택된 일련의 심볼로 표현 될 수 있다고 가정하자. 외계인의 침략을 위해 유니 코드가 충분히 큰가요? 유니 코드는 현재 할당되지 않은 코드 포인트가 백만 미만입니다. 중국어에는 가장 포괄적 인 중국어 사전에 따라 수십만 개의 문자가 포함되어 있습니다 (현재 모든 문자가 유니 코드에서 고유 문자로 지원되는 것은 아닙니다). 따라서 중국어가 복잡한 10 개 언어 만 모든 유니 코드를 사용합니다. 지구상에는 수백 가지의 독창적 인 작문 체계가 있지만 운 좋게도 대부분은 표의 문자가 아니라 알파벳순이므로 소수의 문자가 포함되어 있습니다. 만약 모든 언어가 중국어와 같은 표의 문자를 사용한다면, 유니 코드는 지구에 충분하지 않을 것입니다. 알파벳의 사용은 제한된 수의 음소 만 사용하는 음성에서 비롯되었지만 인간 생리학에 특화되어 있습니다. 따라서 십여 개의 표의 문자 체계 만 갖춘 외계인 행성조차도 유니 코드가 지원할 수있는 수준을 초과 할 수 있습니다. 이제이 외계인이 이미 지구보다 먼저 다른 행성을 침공했으며 지원해야 할 캐릭터 세트에 작문 시스템을 포함 시켰는지 고려하십시오.

현재 인코딩을 확장하거나 수정하거나 새 인코딩을 도입해도이 문제는 해결되지 않습니다. 유니 코드에서 지원하는 코드 포인트 수에 제한이 있기 때문입니다.

따라서 대답은 거의 없습니다.


5
당신은 상상력이 부족합니다. 무용 안무가들은 무대 배우들이 수행해야 할 춤을 설명하고 가르치는 데 사용할 수있는 많은 언어와 용어를 가지고 있습니다. 꿀벌이 무엇을 의사 소통하고 있는지 배우려면, 분명히 그것에 대한 서면 용어를 고안 할 수 있습니다. 결국 오늘날 우리가 쓰는 대부분의 언어는 소리의 인코딩입니다. 인코딩 움직임이 사운드 인코딩과 다르지 않습니다.
whatsisname

3
이 답변의 일부는 훌륭하지만 "서식을 가지고 있지 않을뿐만 아니라 서면으로 표현할 수 없다"고 말하는 것은 명백한 잘못입니다. 정보를 전달하는 것은 비트로 축소 될 수 있으며, 비트로 축소 된 것은 원하는 문자 스트림으로 거의 변환 될 수 있습니다.
Steven Burnap

2
@StevenBurnap True이지만 유니 코드는 단순한 비트 시퀀스 이상입니다. 그것은 비트를 해석하는 방법입니다. 그렇습니다. 유니 코드 문자 집합은 이미지에서 CNC 명령에 이르기까지 모든 것을 나타내도록 확장 될 수 있지만 이것은 매우 다른 생물입니다.
Owen

4
유니 코드 기호가 설명하는 것 (대부분의 언어에서)은 기압 변화의 패턴이며, 대부분의 언어에서 실제로 이러한 패턴과 실제로 일치하는 것은 상당히 엉망입니다.
Steven Burnap

3
그래서 당신은 "태양으로 45도 날아 왼쪽으로 15도, 태양으로 10 초 날아 오른쪽으로 10 초"라는 문장은 불가능하다는 것을 의미합니까? 상황에 따라 당시 태양의 위치가 필요합니다.
Steven Burnap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.