O UTF-8 seria capaz de apoiar a inclusão de uma vasta linguagem alienígena com milhões de novos personagens?

86

No caso de uma invasão alienígena e fomos forçados a suportar seus idiomas em todos os nossos sistemas de computadores existentes, o UTF-8 foi projetado de maneira a permitir sua quantidade possivelmente vasta de caracteres?

(Obviamente, não sabemos se os alienígenas realmente têm idiomas, se ou como eles se comunicam, mas, pelo bem do argumento, imagine-o.)

Por exemplo, se a linguagem deles consistisse em milhões de novos glifos, símbolos e / ou caracteres combinados , o UTF-8 poderia ser teoricamente expandido de maneira ininterrupta para incluir esses novos glifos e ainda suportar todos os softwares existentes?

Estou mais interessado em saber se os glifos ultrapassaram as limitações de tamanho atuais e exigiram mais bytes para representar um único glifo. Caso o UTF-8 não possa ser expandido, isso prova que a única vantagem sobre o UTF-32 é simplesmente o tamanho de caracteres inferiores?

Qix
fonte
16
"apóie suas línguas " (ênfase minha) ... Quantos? Temos certeza de que os idiomas podem ser divididos em caracteres? Talvez a linguagem seja baseada em relações espaciais. - veja Ted Chiang "História da sua vida", Histórias da sua vida e outros . Na melhor das hipóteses, esta é simplesmente uma pergunta de coisas máximas em X-bytes (fora do tópico). Na pior das hipóteses, é um absurdo especulativo. (não está claro o que está pedindo)
Scant Roger
6
@ScantRoger A resposta aceita faz um bom trabalho ao responder à pergunta como ela foi planejada.
Qix
11
A resposta aceita faz um bom trabalho ao nos contar os fatos de UTF-8, UTF-16 e UTF-32. Você pode simplesmente procurar isso na Wikipedia. Quanto à "invasão alienígena", não vejo como a resposta a aborda.
Scant Roger
10
Relacionado (no estouro de pilha): O UTF-8 é suficiente para todos os idiomas comuns?
yannis
9
O Unicode não suporta idiomas, suporta caracteres - glifos usados ​​para representar significado na forma escrita. Muitas linguagens humanas não possuem um script e, portanto, não podem ser suportadas por unicode. Sem mencionar que muitos animais se comunicam, mas não têm uma linguagem escrita. A comunicação por meio de ilustrações ou quadrinhos sem palavras não pode ser suportada por unicode, pois o conjunto de glifos não é finito. Por definição, não sabemos como os alienígenas se comunicam, por isso é impossível responder sua pergunta. Se você só quer saber quantos caracteres distintos unicode pode suportar, você provavelmente deve esclarecer :)
JacquesB

Respostas:

109

O padrão Unicode tem muito espaço de sobra. Os pontos de código Unicode são organizados em "planos" e "blocos". Do total de 17 aviões, existem 11 atualmente não atribuídos . Cada avião possui 65.536 caracteres, então há realisticamente meio milhão de pontos de código de sobra para um idioma alienígena (a menos que preenchamos tudo isso com mais emoticons antes do primeiro contato). A partir do Unicode 8.0, apenas 120.737 pontos de código foram atribuídos no total (aproximadamente 10% da capacidade total), com aproximadamente a mesma quantia sendo não atribuída, mas reservada para uso privado e específico de aplicativo. No total, 974.530 pontos de código não foram atribuídos.

UTF-8 é uma codificação específica de Unicode e atualmente está limitada a quatro octetos (bytes) por ponto de código, que corresponde às limitações de UTF-16. Em particular, o UTF-16 suporta apenas 17 aviões. Anteriormente, o UTF-8 suportava 6 octetos por ponto de código e foi projetado para suportar 32768 aviões. Em princípio, esse limite de 4 bytes poderia ser aumentado, mas isso quebraria a estrutura organizacional atual do Unicode e exigiria a eliminação progressiva do UTF-16 - é improvável que isso aconteça em um futuro próximo, considerando o grau de entrincheiramento em certos sistemas operacionais e programação línguas.

O único motivo pelo qual o UTF-16 ainda é de uso comum é que é uma extensão da codificação UCS-2 defeituosa que suportava apenas um único plano Unicode. Caso contrário, herda propriedades indesejáveis ​​do UTF-8 (não de largura fixa) e UTF-32 (não é compatível com ASCII, desperdício de espaço para dados comuns) e requer marcas de ordem de bytes para declarar endianness. Dado que, apesar desses problemas, o UTF-16 ainda é popular, não estou muito otimista de que isso mudará por si só muito em breve. Felizmente, nossos novos Overlords Estrangeiros verão esse impedimento ao Seu governo, e em Sua sabedoria banirão o UTF-16 da face da terra .

amon
fonte
7
Na verdade, o UTF-8 é limitado a apenas uma parte do limite de 4 bytes, para corresponder ao UTF-16. Especificamente, para 17/32, pouco mais da metade.
Deduplicator
5
Fora do Windows, não conheço outro sistema operacional em que o sistema operacional ou a maioria dos programas no sistema operacional use UTF16. Os programas OSX são tipicamente UTF8, os programas Android são tipicamente UTF8, o Linux normalmente é UTF8. Então, tudo o que precisamos é para o Windows para morrer (ele já é uma espécie de mortos no espaço móvel)
slebetman
23
A menos que preenchamos tudo isso com mais emoticons antes do primeiro contato ... Aí está. A ameaça mais significativa à interação pacífica com alienígenas é o emoji. Estamos condenados.
Rickster
13
@slebetman Na verdade não. Qualquer coisa baseada em JVM usa UTF-16 (Android também, não sei por que você diz isso), o JavaScript usa UTF-16 e, como Java e JavaScript são os idiomas mais populares, o UTF-16 não vai a lugar nenhum a qualquer momento em breve.
Malcolm
5
@Kaiserludi "A maioria dos códigos linux usa UTF32 para unicode", sim, não. Sério, onde diabos você tirou essa ideia? Não há sequer um wfopen syscall ou qualquer outra coisa, é UTF8 todo o caminho. Inferno, mesmo Python e Java - ambos que definem cadeias de caracteres como UTF-16 devido a razões históricas - não armazenam cadeias de caracteres como UTF-16, exceto quando necessário. a memória é cara, a CPU é barata). O mesmo vale para o Android - o JString do NDK é UTF8, principalmente porque os engenheiros do Google não são loucos.
Voo 25/11
30

Se o UTF-8 for realmente estendido, devemos considerar o máximo absoluto que ele poderia representar. UTF-8 está estruturado da seguinte maneira:

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

(copiado descaradamente da RFC .) Vemos que o primeiro byte sempre controla quantos bytes de acompanhamento formam o caractere atual.

Se o estendermos para permitir até 8 bytes, obteremos as representações não-Unicode adicionais

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

Calculando o máximo de representações possíveis que essa técnica permite, chegamos a

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

ou na base 10:

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

o que nos dá a quantidade máxima de representações em 4.468.982.745.216.

Portanto, se esses 4 bilhões de caracteres ( ou trilhões, como quiser ) forem suficientes para representar os idiomas alienígenas, tenho certeza de que podemos, com o mínimo de esforço, estender o UTF-8 atual para agradar nossos novos senhores alienígenas ;-)

Boldewyn
fonte
8
Atualmente, o UTF-8 está limitado a apenas pontos de código até 0x10FFFF - mas isso é apenas para compatibilidade com o UTF-16. Se houver necessidade de estendê-lo, não há ambiguidade sobre como estendê-lo com pontos de código até 0x7FFFFFFF (ou seja, 2³¹-1). Além disso, porém, vi definições conflitantes. Uma definição que eu vi tem 111111xxcomo um primeiro byte possível, seguido por cinco bytes de extensão para um máximo de 2³² pontos de código. Mas isso é compatível apenas com a definição mencionada para os primeiros 2 pontos de código.
kasperd
2
Sim, a Wikipedia diz algo sobre UTF-16, quando na verdade eles significam Unicode ou ISO 10646 (dependendo do contexto). Na verdade, desde o RFC 3629, o UTF-8 é indefinido além de U + 10FFFF (ou F4 8F BF BFem bytes UTF-8). Então, tudo o que menciono aqui além disso é pura especulação. Obviamente, alguém poderia pensar em outras extensões, nas quais um primeiro byte alto significa alguma outra estrutura a seguir (e espero que não destrua a sincronização automática no processo). Tentei concluir o esquema de bytes o mais próximo possível do UTF-8 real.
Boldewyn
4
São 4 trilhões, não quadrilhões.
Ypnypn
1
Não é estritamente necessário que o número de bytes a seguir seja sempre um a menos que o número de bytes iniciais no primeiro byte. O Perl, na verdade, suporta (desde 2000) uma variante interna do UTF-8, na qual os formatos de 5, 6 e 7 bytes são os mesmos que esta resposta, mas FFapresenta uma unidade de código de 13 bytes capaz de armazenar 72 bits. Qualquer coisa acima de 2 ^ 36 é uniformemente muito cara, mas permite codificar um int de 64 bits e mais alguns.
Hbbs #
7

RFC3629 restringe UTF-8 a um máximo de quatro bytes por caractere, com um valor máximo de 0x10FFFF, permitindo um máximo de 1.112.064 pontos de código. Obviamente, essa restrição poderia ser removida e o padrão estendido, mas isso provaria uma mudança de quebra no código existente que funciona até esse limite.

Do ponto de vista do arquivo de dados, isso não seria uma mudança de ruptura, pois o padrão funciona com base no fato de que, se o bit mais significativo (MSB) de cada byte for definido, o próximo byte fará parte da codificação. Mesmo antes do RFC3629, o padrão era limitado a 31 bits, deixando o MSB do quarto byte desativado.

Estender o padrão além de 0x10FFFF quebraria a compatibilidade parcial de dados do UTF-8 com o UTF-16.

David Arno
fonte
5
Então, em teoria, os dados seriam compatíveis com versões anteriores, mas o código não seria inerentemente compatível com a modificação do padrão?
Qix
2
@ Qix, esse é um ponto válido. Qualquer arquivo UTF-8 existente seria naturalmente compatível com, por exemplo, um máximo de 6 bytes para acomodar milhões de pontos de código a mais, mas muitas bibliotecas existentes projetadas para manipular UTF-8 provavelmente não manipulariam essa extensão.
David Arno
4
UTF-16 iria quebrar fatalmente. Por inerência, ele suporta apenas pontos de código de até 0x10FFFF.
gnasher729
1
@ gnasher729: Não é um problema tão grande quanto você imagina. O pré-Unicode resolveu isso por meio de valores de turno (Shift JIS para japonês). Eles simplesmente marcariam um caractere reservado / não utilizado (0xFFFD?) Como um "caractere de deslocamento", que altera a codificação para uma forma mais extensa. Provavelmente UTF32.
quer
4

Realmente, apenas 2 códigos de pontos de código Unicode representam infinitamente muitos glifos, se eles estavam combinando caracteres.

Compare, por exemplo, as duas maneiras que o Unicode codifica para o alfabeto coreano Hangul: Hangul Syllables e Hangul Jamo . O caractere 웃 in Hangul Syllabelsé o ponto de código único, C6C3enquanto Hangul Jamonele estão os três pontos de código 110B(ㅇ) 116E(ㅜ) 11B9(ㅅ). Obviamente, o uso de caracteres combinados ocupa muito menos pontos de código, mas é menos eficiente para escrever porque são necessários mais bytes para escrever cada caractere.

Com esse truque, não há necessidade de ir além do número de pontos de código que atualmente podem ser codificados em UTF-8 ou UTF-16.

Eu acho que tudo se resume a como os alienígenas ficariam ofendidos se o idioma deles exigisse muito mais bytes por mensagem do que os idiomas terrestres. Se eles não se importam, digamos, em representar cada um dos milhões de caracteres usando uma mistura de digamos, 100k caracteres combinados, não há problema; por outro lado, se ser forçado a usar mais bytes do que os terráqueos faz com que se sintam cidadãos de segunda classe, poderíamos ter algum conflito ( não muito diferente do que já observamos com o UTF-8 ).

Owen
fonte
Este é apenas o caso se os caracteres na língua estrangeira forem realmente compostos por um conjunto mais limitado de grafemas. Pode não ser esse o caso.
JacquesB
1
Tanto quanto sei, não há exigência de que a combinação de caracteres precise se relacionar com grafemas individuais. O FAQ do Unicode é silencioso quanto a isso, mas minha impressão é que não seria mais difícil para um mecanismo de layout oferecer suporte a sequências de penteados que não sejam sequências de grafemas, pois em ambos os casos seria necessário um glifo pré-composto.
Owen
Quanto tempo esses alienígenas vivem, e quantos caracteres não decomponíveis em grafemas eles podem aprender durante a infância? E o Hangul pré-composto mantém sua vantagem de bytes em relação ao Hangul decomposto, mesmo após o gzip?
Damian Yerrick
-2

Edit: A pergunta agora diz "milhões de novos personagens". Isso facilita a resposta:

Não . Utf-8 é uma codificação Unicode. O Unicode possui um espaço de código que permite 1.114.112 pontos de código distintos e menos de um milhão atualmente não está atribuído. Portanto, não é possível oferecer suporte a milhões de novos caracteres em Unicode. Por definição, nenhuma codificação Unicode pode suportar mais caracteres do que o definido por Unicode. (É claro que você pode trapacear codificando um nível ainda mais - qualquer tipo de dado pode ser representado por apenas dois caracteres.)


Para responder à pergunta original:

O Unicode não suporta idiomas, como tal, suporta caracteres - símbolos usados ​​para representar o idioma na forma escrita.

Nem todas as línguas humanas têm uma representação escrita; portanto, nem todas as línguas humanas podem ser suportadas pelo Unicode. Além disso, muitos animais se comunicam, mas não possuem linguagem escrita. As baleias, por exemplo, têm uma forma de comunicação complexa o suficiente para chamar um idioma, mas não possui nenhuma forma escrita (e também não pode ser capturada pela notação fonética existente). Portanto, nem todos os idiomas do mundo podem ser suportados pelo Unicode.

Pior ainda é algo como a linguagem das abelhas. Não apenas não possui uma forma escrita, como também não pode ser representado de forma significativa. A linguagem é um tipo de dança que basicamente aponta em uma direção, mas depende da posição atual do sol. Portanto, a dança só tem valor informativo no local e horário específicos em que é realizada. Uma representação simbólica ou textual teria que incluir informações (localização, posição do sol) que a linguagem das abelhas atualmente não pode expressar.

Mesmo uma forma de comunicação escrita ou simbólica pode não ser possível representar em Unicode. Por exemplo, ilustrações ou quadrinhos sem palavras não podem ser suportados pelo Unicode, pois o conjunto de glifos não é finito. Você notará muita comunicação pictórica em ambientes internacionais como um aeroporto, portanto, não é inconcebível que uma raça de alienígenas que viajam no espaço tenha evoluído para usar uma linguagem pictórica.

Mesmo se uma raça alienígena tivesse um idioma com um sistema de escrita com um conjunto finito de símbolos, talvez esse sistema não seja possível de ser suportado no Unicode. O Unicode espera que a escrita seja uma sequência linear de símbolos. A notação musical é um exemplo de um sistema de escrita que não pode ser totalmente representado em Unicode, porque o significado é codificado na escolha dos símbolos e na colocação vertical e horizontal. (O Unicode suporta símbolos musicais individuais, mas não pode codificar uma partitura.) Uma raça alienígena que se comunica usando música polifônica (não incomum) ou um canal de comunicação de complexidade semelhante, pode muito bem ter um sistema de escrita parecido com uma partitura orquestral, e Unicode não pode suportar isso.

Mas, por uma questão de argumento, suponha que todas as línguas, mesmo línguas estrangeiras, possam ser expressas como uma sequência linear de símbolos selecionados de um conjunto finito. O Unicode é grande o suficiente para uma invasão alienígena? Atualmente, o Unicode possui menos de um milhão de pontos de código não atribuídos. O idioma chinês contém centenas de milhares de caracteres de acordo com o dicionário chinês mais abrangente (nem todos eles são atualmente suportados pelo Unicode como caracteres distintos). Portanto, apenas dez idiomas com a complexidade do chinês usariam todo o Unicode. Na terra, temos centenas de sistemas de escrita distintos, mas felizmente a maioria é alfabética, e não ideográfica, e, portanto, contém um pequeno número de caracteres. Se todas as línguas escritas usassem ideogramas como o chinês, o Unicode nem seria grande o suficiente para a Terra. O uso de alfabetos é derivado da fala, que utiliza apenas um número limitado de fonemas, mas isso é particular para a fisiologia humana. Assim, mesmo um único planeta alienígena com apenas uma dúzia de sistemas ideográficos de escrita pode exceder o que o Unicode pode suportar. Agora considere se esse alienígena já invadiu outros planetas antes da Terra e incluiu seus sistemas de escrita no conjunto de caracteres que precisam ser suportados.

A expansão ou modificação das codificações atuais ou a introdução de novas codificações não resolverão isso, pois a limitação está no número de pontos de código suportados pelo Unicode.

Portanto, a resposta provavelmente não é.

JacquesB
fonte
5
Você está com falta de imaginação. Os coreógrafos de dança têm muita linguagem e terminologia que podem usar para descrever e ensinar as danças que os atores do palco devem fazer. Se aprendêssemos o que as abelhas estavam se comunicando, poderíamos definitivamente criar uma terminologia escrita para isso. Afinal, a maioria das nossas línguas escritas hoje é uma codificação de som. O movimento de codificação não é tão diferente do som de codificação.
Whatsisname
3
Partes desta resposta são boas, mas dizer "Não só não possui uma forma escrita, como também não pode ser representada na forma escrita" é simplesmente errado. Qualquer coisa que transmita informações pode ser reduzida a bits, e qualquer coisa reduzida a bits pode ser transformada em praticamente qualquer fluxo de caracteres que você desejar.
Steven Burnap
2
@StevenBurnap True, mas o Unicode é mais do que apenas uma sequência de bits. É uma maneira de interpretar esses bits, que é bastante rígida. Sim, o conjunto de caracteres Unicode pode ser expandido para representar qualquer coisa, de imagens a instruções do CNC, mas isso seria uma criatura muito diferente.
Owen
4
Lembre-se de que o que os símbolos unicode descrevem (na maioria dos idiomas) são padrões na variação da pressão do ar e que, na maioria dos idiomas, ele faz um trabalho bastante ruim para realmente corresponder a esses padrões.
Steven Burnap
3
Então você quer dizer a frase "voar 45 segundos com o sol 15 graus à sua esquerda, depois voar 10 segundos com o sol 10 graus à sua direita" é impossível? Certamente requer a posição do sol na época como contexto.
Steven Burnap