W przypadku inwazji obcych i zmuszeni jesteśmy wspierać ich języki we wszystkich naszych istniejących systemach komputerowych, czy UTF-8 został zaprojektowany w taki sposób, aby uwzględnić ich możliwie dużą liczbę postaci?
(Oczywiście nie wiemy, czy kosmici rzeczywiście mają języki, czy i jak się komunikują, ale ze względu na kłótnię, wyobraź sobie, że tak.)
Na przykład, jeśli ich język składałby się z milionów nowo odkrytych glifów, symboli i / lub znaków łączących , czy teoretycznie UTF-8 mógłby zostać teoretycznie rozwinięty w sposób nieprzerwany, aby obejmował te nowe glify i nadal obsługiwał całe istniejące oprogramowanie?
Bardziej interesuje mnie to, czy glify znacznie przekroczyły obecne ograniczenia wielkości i wymagały więcej bajtów do reprezentowania pojedynczego glifu. W przypadku, gdyby UTF-8 nie mógł zostać rozszerzony, czy to dowodzi, że pojedynczą przewagą nad UTF-32 jest po prostu rozmiar niższych znaków?
Odpowiedzi:
Standard Unicode ma dużo miejsca do stracenia. Punkty kodowe Unicode są zorganizowane w „płaszczyznach” i „blokach”. Z 17 wszystkich samolotów jest obecnie 11 nieprzypisanych . Każdy samolot ma 65 536 znaków, więc realistycznie jest pół miliona współrzędnych kodowych dla obcego języka (chyba że wypełnimy to wszystko emoji przed pierwszym kontaktem). Począwszy od Unicode 8.0, tylko 120 737 punktów kodowych zostało przypisanych łącznie (około 10% całkowitej pojemności), przy czym mniej więcej ta sama ilość jest nieprzydzielona, ale zarezerwowana do prywatnego, specyficznego dla aplikacji zastosowania. W sumie 974 530 współrzędnych kodowych jest nieprzypisanych.
UTF-8 jest specyficznym kodowaniem Unicode i obecnie jest ograniczony do czterech oktetów (bajtów) na punkt kodowy, co odpowiada ograniczeniom UTF-16. W szczególności UTF-16 obsługuje tylko 17 samolotów. Wcześniej UTF-8 obsługiwał 6 oktetów na punkt kodowy i był zaprojektowany do obsługi 32768 samolotów. Zasadniczo ten 4-bajtowy limit mógłby zostać zniesiony, ale złamałoby to obecną strukturę organizacyjną Unicode i wymagałoby wycofania UTF-16 - jest mało prawdopodobne w bliskiej przyszłości, biorąc pod uwagę stopień zakorzenienia w niektórych systemach operacyjnych i programowaniu Języki.
Jedynym powodem, dla którego UTF-16 jest nadal w powszechnym użyciu, jest rozszerzenie wadliwego kodowania UCS-2, które obsługuje tylko jedną płaszczyznę Unicode. W przeciwnym razie dziedziczy niepożądane właściwości zarówno z UTF-8 (nie o stałej szerokości), jak i UTF-32 (nie kompatybilny z ASCII, marnowanie miejsca na wspólne dane) i wymaga znaków bajtów do deklarowania endianizmu. Biorąc pod uwagę, że pomimo tych problemów UTF-16 jest nadal popularny, nie jestem zbyt optymistyczny, że to się wkrótce zmieni. Mamy nadzieję, że nasi nowi Władcy Obcych zobaczą przeszkodę dla ich rządów, a ich mądrość usunie UTF-16 z powierzchni ziemi .
źródło
wfopen
wywołania systemowego ani nic innego, to UTF8 przez całą drogę. Do diabła nawet Python i Java - oba, które ze względów historycznych definiują ciągi jako UTF-16 - nie przechowują ciągów jako UTF-16, chyba że jest to konieczne. Duża pamięć i brak wydajności (i to pomimo dodatkowego kodu do obsługi konwersji - pamięć jest droga, procesor jest tani). To samo dotyczy Androida - JString NDK to UTF8, głównie dlatego, że inżynierowie Google nie są szaleni.Jeśli UTF-8 rzeczywiście ma zostać rozszerzony, powinniśmy spojrzeć na absolutne maksimum, jakie może reprezentować. UTF-8 ma następującą strukturę:
(bezwstydnie skopiowane z RFC .) Widzimy, że pierwszy bajt zawsze kontroluje, ile kolejnych bajtów składa się na bieżący znak.
Jeśli rozszerzymy go do 8 bajtów, otrzymamy dodatkowe reprezentacje inne niż Unicode
Obliczanie maksymalnych możliwych reprezentacji, do których pozwala ta technika
lub w bazie 10:
co daje nam maksymalną liczbę reprezentacji wynoszącą 4 468,982,745,216.
Jeśli więc te 4 miliardy ( lub tryliony, jak chcesz ) znaków wystarczą do przedstawienia obcych języków, jestem całkiem pewien, że przy minimalnym wysiłku możemy rozszerzyć obecny UTF-8, aby zadowolić naszych nowych obcych władców ;-)
źródło
111111xx
jako pierwszy bajt, po którym następuje pięć bajtów rozszerzenia dla maksymalnie 2³² punktów kodowych. Jest to jednak zgodne tylko z definicją wymienioną dla pierwszych 2³ punktów kodowych.F4 8F BF BF
w bajtach UTF-8). Więc wszystko, o czym tu wspominam, to czysta spekulacja. Oczywiście, ktoś może pomyśleć o innych rozszerzeniach, w których pierwszy wysoki bajt oznacza inną strukturę następującą (i miejmy nadzieję, że nie zniszczy samo-synchronizacji w tym procesie). Próbowałem jednak ukończyć schemat bajtów, aby być jak najbliżej prawdziwego UTF-8.FF
wprowadza 13-bajtową jednostkę kodową zdolną do przechowywania 72 bitów. Wszystko powyżej 2 ^ 36 jest jednolicie bardzo drogie, ale pozwala na kodowanie 64-bitowego inta, a potem jeszcze trochę.RFC3629 ogranicza UTF-8 do maksymalnie czterech bajtów na znak, przy maksymalnej wartości 0x10FFFF, umożliwiając maksymalnie 1112 064 punktów kodowych. Oczywiście to ograniczenie można usunąć i rozszerzyć standard, ale byłoby to przełomową zmianą dla istniejącego kodu, który działa do tego limitu.
Z punktu widzenia pliku danych nie byłaby to przełomowa zmiana, ponieważ standard działa na podstawie tego, że jeśli ustawiony jest najbardziej znaczący bit (MSB) każdego bajtu, to następny bajt jest częścią kodowania. Nawet przed RFC3629 standard był ograniczony do 31 bitów, pozostawiając MSB czwartego bajtu nieustawionym.
Jednak rozszerzenie standardu poza 0x10FFFF złamałoby częściową kompatybilność danych UTF-8 z UTF-16.
źródło
Naprawdę, tylko 2 kody punktowe Unicode oznaczają nieskończenie wiele glifów, jeśli łączą one znaki.
Porównaj na przykład dwa sposoby kodowania Unicode dla koreańskiego alfabetu Hangul : Hangul Syllables i Hangul Jamo . Znak 웃
Hangul Syllabels
jest pojedynczym kodem,C6C3
podczas gdy wHangul Jamo
nim są trzy kody110B
(ㅇ)116E
(ㅜ)11B9
(ㅅ). Oczywiście użycie łączenia znaków zajmuje znacznie mniej punktów kodowych, ale jest mniej wydajne w pisaniu, ponieważ potrzeba więcej bajtów do napisania każdego znaku.Dzięki tej sztuczce nie trzeba przekraczać liczby punktów kodowych, które można obecnie zakodować w UTF-8 lub UTF-16.
Wydaje mi się, że sprowadza się to do urażenia kosmitów, gdyby ich język wymagał więcej bajtów na wiadomość niż języki ziemskie. Jeśli nie przeszkadza im to, powiedzmy, reprezentowanie każdego z ich milionów znaków przy użyciu mieszanki, powiedzmy, 100k łączących postaci, to nie ma problemu; z drugiej strony, jeśli zmuszenie ich do użycia większej liczby bajtów niż Ziemian sprawi, że poczują się jak obywatele drugiej kategorii, moglibyśmy popaść w jakiś konflikt (podobnie jak w przypadku UTF-8 ).
źródło
Edycja: pytanie brzmi teraz „miliony nowych postaci”. Ułatwia to odpowiedź:
Nie . Utf-8 to kodowanie Unicode. Unicode ma przestrzeń kodową, która umożliwia 1114112 różnych punktów kodowych , a mniej niż milion jest obecnie nieprzypisany. Dlatego nie można obsługiwać milionów nowych znaków w standardzie Unicode. Z definicji żadne kodowanie Unicode nie może obsłużyć większej liczby znaków niż to, które jest zdefiniowane przez Unicode. (Oczywiście możesz oszukiwać, kodując dalej poziom - każdy rodzaj danych może być reprezentowany przez zaledwie dwa znaki).
Aby odpowiedzieć na oryginalne pytanie:
Unicode nie obsługuje języków jako takich, obsługuje znaki - symbole używane do reprezentowania języka w formie pisemnej.
Nie wszystkie języki ludzkie mają pisemną reprezentację, więc nie wszystkie języki ludzkie mogą być obsługiwane przez Unicode. Ponadto wiele zwierząt komunikuje się, ale nie ma języka pisanego. Na przykład wieloryby mają formę komunikacji, która jest wystarczająco złożona, aby wywoływać język, ale nie ma żadnej formy pisemnej (i nie może być uchwycona przez istniejącą notację fonetyczną). Dlatego nawet wszystkie języki na ziemi nie mogą być obsługiwane przez Unicode.
Jeszcze gorzej jest coś w rodzaju języka pszczół. Nie tylko nie ma formy pisemnej, ale nie może być w sposób znaczący reprezentowany w formie pisemnej. Język jest rodzajem tańca, który zasadniczo wskazuje kierunek, ale zależy od aktualnej pozycji słońca. Dlatego taniec ma wartość informacyjną tylko w określonym miejscu i czasie, w którym jest wykonywany. Symboliczne lub tekstowe przedstawienie musiałoby zawierać informacje (położenie, położenie słońca), których język pszczół obecnie nie jest w stanie wyrazić.
Nawet pisemna lub symboliczna forma komunikacji może nie być możliwa do przedstawienia w Unicode. Na przykład ilustracje lub komiksy bez słów nie mogą być obsługiwane przez Unicode, ponieważ zestaw glifów nie jest skończony. Zauważysz wiele obrazowej komunikacji w warunkach międzynarodowych, takich jak lotnisko, więc nie jest wykluczone, że rasa kosmitów podróżujących w kosmosie ewoluowała, używając języka obrazkowego.
Nawet jeśli obca rasa ma język z systemem pisania ze skończonym zestawem symboli, ten system może nie być obsługiwany w Unicode. Unicode oczekuje, że pisanie będzie liniową sekwencją symboli. Notacja muzyczna jest przykładem systemu pisania, który nie może być w pełni reprezentowany w Unicode, ponieważ znaczenie jest zakodowane zarówno w wyborze symboli, jak i w pionie i poziomie. (Unicode obsługuje pojedyncze symbole muzyczne, ale nie może zakodować partytury.) Obca rasa, która komunikowała się za pomocą muzyki polifonicznej (nierzadko) lub kanału komunikacji o podobnej złożoności, mogłaby równie dobrze mieć system zapisu przypominający partyturę orkiestrową, i Unicode nie obsługuje tego.
Ale dla argumentu załóżmy, że wszystkie języki, nawet języki obce, mogą być wyrażone jako liniowa sekwencja symboli wybranych ze zbioru skończonego. Czy Unicode jest wystarczająco duży, aby przeprowadzić inwazję kosmitów? Unicode ma obecnie mniej niż milion nieprzypisanych współrzędnych kodowych. Język chiński zawiera sto tysięcy znaków według najbardziej wyczerpującego chińskiego słownika (nie wszystkie z nich są obecnie obsługiwane przez Unicode jako odrębne znaki). Tak więc tylko dziesięć języków o złożonym języku chińskim zużyłoby cały Unicode. Na ziemi mamy setki różnych systemów pisma, ale na szczęście większość z nich ma charakter alfabetyczny niż ideograficzny i dlatego zawiera niewielką liczbę znaków. Gdyby wszystkie języki pisane używały ideogramów takich jak chiński, Unicode nie byłby nawet wystarczająco duży dla Ziemi. Używanie alfabetów wywodzi się z mowy, która używa tylko ograniczonej liczby fonemów, ale jest to szczególne w przypadku fizjologii człowieka. Tak więc nawet jedna obca planeta z zaledwie tuzinem ideograficznych systemów pisania może przekroczyć możliwości Unicode. Teraz zastanów się, czy ten obcy już zaatakował inne planety przed Ziemią i włączył swoje systemy pisania do zestawu znaków, które muszą być obsługiwane.
Rozszerzenie lub modyfikacja obecnych kodowań lub wprowadzenie nowych kodowań nie rozwiąże tego, ponieważ ograniczenie dotyczy liczby punktów kodowych obsługiwanych przez Unicode.
Więc odpowiedź brzmi najprawdopodobniej nie.
źródło