Apakah UTF-8 dapat mendukung masuknya bahasa asing yang luas dengan jutaan karakter baru?

86

Jika invasi alien terjadi dan kami dipaksa untuk mendukung bahasa mereka di semua sistem komputer kami yang ada, apakah UTF-8 dirancang sedemikian rupa untuk memungkinkan sejumlah besar karakter mereka?

(Tentu saja, kita tidak tahu apakah alien benar-benar memiliki bahasa, jika atau bagaimana mereka berkomunikasi, tetapi demi argumen, tolong bayangkan mereka melakukannya.)

Misalnya, jika bahasa mereka terdiri dari jutaan mesin terbang yang baru ditemukan, simbol, dan / atau menggabungkan karakter , dapatkah UTF-8 secara teoritis diperluas dengan cara yang tidak melanggar untuk memasukkan mesin terbang baru ini dan masih mendukung semua perangkat lunak yang ada?

Saya lebih tertarik jika mesin terbang jauh melampaui batasan ukuran saat ini dan membutuhkan lebih banyak byte untuk mewakili mesin terbang tunggal. Jika UTF-8 tidak dapat diperluas, apakah itu membuktikan bahwa keunggulan tunggal dibandingkan UTF-32 hanyalah ukuran karakter yang lebih rendah?

Qix
sumber
16
"mendukung bahasa mereka " (penekanan saya) ... Berapa banyak? Apakah kami yakin bahasanya dapat dipecah menjadi karakter? Mungkin bahasanya didasarkan pada hubungan spasial. - lihat Ted Chiang "Kisah Hidup Anda", Kisah Hidup Anda dan Lainnya . Paling-paling, ini hanyalah pertanyaan maks-hal-dalam-X-byte (di luar topik). Paling buruk, itu omong kosong spekulatif. (tidak jelas apa yang Anda minta)
Scant Roger
6
@ ScantRoger Jawaban yang diterima berfungsi dengan baik dalam menjawab pertanyaan sebagaimana dimaksud.
Qix
11
Jawaban yang diterima berfungsi dengan baik untuk memberi tahu kami fakta-fakta UTF-8, UTF-16, dan UTF-32. Anda bisa mencarinya di Wikipedia. Adapun "invasi alien", saya tidak melihat bagaimana jawabannya mengatasinya sama sekali.
Scant Roger
10
Terkait (pada Stack Overflow): Apakah UTF-8 cukup untuk semua bahasa umum?
yannis
9
Unicode tidak mendukung bahasa, mendukung karakter - mesin terbang yang digunakan untuk mewakili makna dalam bentuk tertulis. Banyak bahasa manusia tidak memiliki skrip dan karenanya tidak dapat didukung oleh unicode. Belum lagi banyak hewan berkomunikasi tetapi tidak memiliki bahasa tertulis. Komunikasi dengan ilustrasi atau komik tanpa kata tidak dapat didukung oleh unicode karena rangkaian mesin terbang tidak terbatas. Menurut definisi, kami tidak tahu bagaimana alien berkomunikasi, jadi pertanyaan Anda tidak mungkin dijawab. Jika Anda hanya ingin tahu berapa banyak karakter unik yang dapat didukung unicode, Anda mungkin harus menjelaskan :)
JacquesB

Jawaban:

109

Standar Unicode memiliki banyak ruang kosong. Codepoints Unicode diatur dalam "pesawat" dan "blok". Dari 17 total pesawat, ada 11 yang saat ini tidak ditugaskan . Setiap pesawat memiliki 65.536 karakter, jadi ada setengah juta codepoint realistis untuk cadangan untuk bahasa asing (kecuali kita mengisi semua itu dengan lebih banyak emoji sebelum kontak pertama). Pada Unicode 8.0, hanya 120.737 poin kode telah ditetapkan secara total (kira-kira 10% dari total kapasitas), dengan jumlah yang kira-kira sama belum ditetapkan tetapi dicadangkan untuk penggunaan pribadi, khusus aplikasi. Secara total, 974.530 codepoint tidak ditugaskan.

UTF-8 adalah pengkodean khusus Unicode, dan saat ini terbatas pada empat oktet (byte) per titik kode, yang cocok dengan batasan UTF-16. Secara khusus, UTF-16 hanya mendukung 17 pesawat. Sebelumnya, UTF-8 mendukung 6 oktet per codepoint, dan dirancang untuk mendukung 32768 pesawat. Pada prinsipnya batas 4 byte ini dapat diangkat, tetapi itu akan memecah struktur organisasi Unicode saat ini, dan akan mengharuskan UTF-16 dihapus secara bertahap - tidak mungkin terjadi dalam waktu dekat mengingat betapa mengakarnya dalam sistem operasi dan pemrograman tertentu bahasa.

Satu-satunya alasan UTF-16 masih umum digunakan adalah bahwa itu merupakan perluasan ke pengkodean UCS-2 yang cacat yang hanya mendukung satu pesawat Unicode. Selain itu mewarisi sifat-sifat yang tidak diinginkan baik dari UTF-8 (tidak lebar tetap) dan UTF-32 (tidak kompatibel ASCII, pemborosan ruang untuk data umum), dan memerlukan tanda urutan byte untuk menyatakan endianness. Mengingat bahwa meskipun ada masalah-masalah ini UTF-16 masih populer, saya tidak terlalu optimis bahwa ini akan segera berubah dengan sendirinya. Mudah-mudahan, Alien Overlords kami yang baru akan melihat halangan ini untuk aturan mereka, dan dalam kebijaksanaan mereka mengusir UTF-16 dari muka bumi .

amon
sumber
7
Sebenarnya, UTF-8 terbatas hanya pada sebagian dari bahkan batas 4-byte, agar sesuai dengan UTF-16. Secara khusus, untuk 17/32 itu, sedikit lebih dari setengah.
Deduplicator
5
Di luar Windows saya tahu tidak ada OS lain di mana OS atau sebagian besar program pada OS menggunakan UTF16. Program OSX biasanya UTF8, program Android biasanya UTF8, Linux biasanya UTF8. Jadi yang kita butuhkan adalah agar Windows mati (sudah seperti mati di ruang ponsel)
slebetman
23
Kecuali kita mengisi semua itu dengan lebih banyak emoji sebelum kontak pertama ... Itu dia. Ancaman paling signifikan terhadap interaksi damai dengan alien adalah emoji. Kita celaka.
rickster
13
@slebetman Tidak juga. Apa pun yang berbasis JVM menggunakan UTF-16 (Android juga, tidak yakin mengapa Anda mengatakannya tidak), JavaScript menggunakan UTF-16, dan mengingat bahwa Java dan JavaScript adalah bahasa yang paling populer, UTF-16 tidak akan kemana-mana kapan saja segera.
Malcolm
5
@Kaiserludi "Sebagian besar kode linux menggunakan UTF32 untuk unicode", ya, tidak. Serius dari mana Anda mendapatkan ide itu? Bahkan tidak ada wfopen syscall atau apa pun, itu UTF8 sepanjang jalan. Neraka bahkan Python dan Java - keduanya yang mendefinisikan string sebagai UTF-16 karena alasan historis - jangan menyimpan string sebagai UTF-16 kecuali bila perlu .. manfaat memori yang besar dan tidak ada performa yang dicapai (dan meskipun ada kode tambahan untuk menangani konversi - memori mahal, CPU murah). Hal yang sama berlaku untuk Android - JString NDK adalah UTF8, sebagian besar karena insinyur Google tidak gila.
Voo
30

Jika UTF-8 sebenarnya diperpanjang, kita harus melihat maksimum absolut yang bisa diwakilinya. UTF-8 disusun seperti ini:

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

(tanpa malu-malu disalin dari RFC .) Kita melihat bahwa byte pertama selalu mengontrol berapa banyak byte tindak lanjut yang membentuk karakter saat ini.

Jika kami memperluasnya hingga 8 byte, kami mendapatkan representasi non-Unicode tambahan

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

Menghitung representasi maksimum yang memungkinkan teknik ini memungkinkan kita

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

atau di basis 10:

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

yang memberi kami jumlah maksimum representasi sebagai 4.468.982.745.216.

Jadi, jika 4 miliar ( atau triliun, sesuka Anda ) karakter ini cukup untuk mewakili bahasa asing, saya cukup positif bahwa kami dapat, dengan upaya minimal, memperpanjang UTF-8 saat ini untuk menyenangkan penguasa asing baru kami ;-)

Boldewyn
sumber
8
Saat ini UTF-8 terbatas hanya pada titik kode hingga 0x10FFFF - tetapi itu hanya untuk kompatibilitas dengan UTF-16. Jika ada kebutuhan untuk memperpanjangnya, tidak ada ambiguitas tentang cara memperpanjangnya dengan poin kode hingga 0x7FFFFFFF (itu 2³¹-1). Tetapi di luar itu saya telah melihat definisi yang saling bertentangan. Satu definisi yang saya lihat memiliki 111111xxbyte pertama yang mungkin diikuti oleh lima ekstensi byte untuk maksimum 2³² poin kode. Tapi itu hanya kompatibel dengan definisi yang Anda sebutkan untuk 2³¹ poin kode pertama.
kasperd
2
Ya, Wikipedia mengatakan sesuatu tentang UTF-16, padahal sebenarnya maksudnya adalah Unicode atau ISO 10646 (tergantung pada konteksnya). Sebenarnya, sejak RFC 3629, UTF-8 tidak terdefinisi melebihi U + 10FFFF (atau F4 8F BF BFdalam byte UTF-8). Jadi, semua yang saya sebutkan di sini adalah spekulasi murni. Tentu saja, seseorang dapat memikirkan ekstensi lain, di mana byte pertama yang tinggi menandakan beberapa struktur berikut (dan mudah-mudahan tidak merusak sinkronisasi diri dalam proses). Saya mencoba untuk menyelesaikan skema byte menjadi sedekat mungkin dengan UTF-8, mungkin.
Boldewyn
4
Itu 4 triliun, bukan kuadriliun.
Ypnypn
1
Ini tidak sepenuhnya diperlukan untuk jumlah byte berikut untuk selalu menjadi kurang dari jumlah yang memimpin dalam byte pertama. Perl sebenarnya mendukung (sejak 2000) varian internal UTF-8 di mana bentuk 5, 6, dan 7 byte sama dengan jawaban ini, tetapi FFmemperkenalkan unit kode 13-byte yang mampu menyimpan 72 bit. Lebih dari 2 ^ 36 secara seragam sangat mahal, tetapi ini memungkinkan encoding int 64-bit dan kemudian beberapa.
hobbs
7

RFC3629 membatasi UTF-8 hingga maksimum empat byte per karakter, dengan nilai maksimum 0x10FFFF, memungkinkan maksimum 1.112.064 poin kode. Jelas pembatasan ini dapat dihapus dan standar diperpanjang, tetapi ini akan membuktikan perubahan melanggar untuk kode yang ada yang berfungsi untuk batas itu.

Dari sudut pandang file data, ini tidak akan menjadi perubahan yang melanggar karena standar bekerja atas dasar bahwa jika bit paling signifikan (MSB) dari setiap byte diatur, maka byte berikutnya adalah bagian dari pengkodean. Bahkan sebelum RFC3629, standar dibatasi hingga 31 bit, meninggalkan MSB dari byte keempat tidak disetel.

Memperluas standar melampaui 0x10FFFF akan merusak kompatibilitas data sebagian UTF-8 dengan UTF-16.

David Arno
sumber
5
Jadi secara teori, data akan kompatibel ke belakang, tetapi kode tidak akan secara inheren kompatibel dengan modifikasi ke standar?
Qix
2
@ Qix, Itu poin yang valid. Setiap file UTF-8 yang ada secara alami akan kompatibel dengan misalnya maksimum 6 byte untuk menampung jutaan lebih banyak poin kode, tetapi banyak perpustakaan yang ada yang dirancang untuk menangani UTF-8 kemungkinan tidak akan menangani ekstensi itu.
David Arno
4
UTF-16 akan patah secara fatal. Secara inheren hanya dapat mendukung poin kode hingga 0x10FFFF.
gnasher729
1
@ gnasher729: Masalahnya tidak sebesar yang Anda kira. Pra-Unicode menyelesaikan ini melalui nilai-nilai shift (Shift JIS for Japanese). Mereka hanya menandai karakter yang dipesan / tidak digunakan (0xFFFD?) Sebagai "karakter shift", yang menggeser pengkodean ke bentuk yang lebih luas. Mungkin UTF32.
Mooing Duck
4

Sungguh, hanya 2 kode-kode Unicode yang mewakili banyak mesin terbang, jika mereka menggabungkan karakter.

Bandingkan, misalnya, dua cara yang dikodekan Unicode untuk alfabet Hangul Korea: Suku kata Hangul dan Hangul Jamo . Karakter 웃 in Hangul Syllabelsadalah titik kode tunggal C6C3sedangkan di Hangul Jamodalamnya adalah tiga titik kode 110B(ㅇ) 116E(ㅜ) 11B9(ㅅ). Jelas, menggunakan kombinasi karakter membutuhkan jauh lebih sedikit titik kode, tetapi kurang efisien untuk menulis karena lebih banyak byte diperlukan untuk menulis setiap karakter.

Dengan trik ini, tidak perlu melampaui jumlah poin kode yang saat ini dapat dikodekan dalam UTF-8 atau UTF-16.

Saya kira turun ke seberapa tersinggung para alien akan jika bahasa mereka kebetulan membutuhkan lebih banyak byte per pesan daripada bahasa duniawi. Jika mereka tidak keberatan, katakanlah, mewakili masing-masing dari jutaan karakter mereka menggunakan campuran kata, 100rb menggabungkan karakter, maka tidak ada masalah; di sisi lain jika dipaksa untuk menggunakan lebih banyak byte daripada penduduk bumi membuat mereka merasa seperti warga negara kelas dua, kita bisa berada dalam beberapa konflik ( tidak seperti apa yang sudah kita amati dengan UTF-8 ).

Owen
sumber
Ini hanya terjadi jika karakter dalam bahasa asing sebenarnya terdiri dari set grafem yang lebih terbatas. Ini mungkin bukan masalahnya.
JacquesB
1
Sejauh yang saya ketahui tidak ada persyaratan bahwa menggabungkan karakter harus berhubungan dengan masing-masing grafik. Unicode FAQ bungkam mengenai hal ini, tetapi kesan saya adalah bahwa tidak akan lebih sulit untuk mesin tata letak untuk mendukung urutan combing yang bukan urutan grapheme, karena dalam kedua kasus tersebut diperlukan mesin terbang yang telah dikomposisi sebelumnya.
Owen
Berapa lama alien ini hidup, dan berapa banyak karakter yang tidak terurai menjadi grafik yang dapat mereka pelajari selama masa kanak-kanak? Dan apakah Hangul yang didekomposisi mempertahankan keunggulan byte-nya dibandingkan dengan Hangul yang terdekomposisi bahkan setelah gzip?
Damian Yerrick
-2

Sunting: Pertanyaannya sekarang mengatakan "jutaan karakter baru". Ini membuatnya mudah untuk dijawab:

Tidak ada . Utf-8 adalah pengkodean Unicode. Unicode memiliki ruang kode yang memungkinkan 1.114.112 codepoint yang berbeda , dan kurang dari satu juta saat ini tidak ditugaskan. Jadi tidak mungkin untuk mendukung jutaan karakter baru di Unicode. Menurut definisi, tidak ada pengkodean Unicode yang dapat mendukung lebih banyak karakter daripada yang didefinisikan oleh Unicode. (Tentu saja Anda dapat menipu dengan menyandikan level lebih lanjut - jenis data apa pun dapat diwakili oleh hanya dua karakter.)


Untuk menjawab pertanyaan awal:

Unicode tidak mendukung bahasa seperti itu, ia mendukung karakter - simbol yang digunakan untuk mewakili bahasa dalam bentuk tertulis.

Tidak semua bahasa manusia memiliki representasi tertulis, jadi tidak semua bahasa manusia dapat didukung oleh Unicode. Selain itu banyak hewan berkomunikasi tetapi tidak memiliki bahasa tertulis. Paus, misalnya, memiliki bentuk komunikasi yang cukup kompleks untuk menyebut suatu bahasa, tetapi tidak memiliki bentuk tertulis apa pun (dan juga tidak dapat ditangkap oleh notasi fonetik yang ada). Jadi tidak semua bahasa di bumi dapat didukung oleh Unicode.

Lebih buruk lagi adalah sesuatu seperti bahasa lebah. Bukan saja tidak memiliki bentuk tertulis, itu tidak dapat diwakili secara bermakna dalam bentuk tertulis. Bahasa adalah sejenis tarian yang pada dasarnya menunjuk ke suatu arah tetapi bergantung pada posisi matahari saat ini. Oleh karena itu tarian hanya memiliki nilai informasi di tempat dan waktu tertentu di mana ia dilakukan. Representasi simbolik atau tekstual harus memasukkan informasi (lokasi, posisi matahari) yang bahasa lebah saat ini tidak dapat mengungkapkan.

Bahkan bentuk komunikasi tertulis atau simbolis mungkin tidak dapat direpresentasikan dalam Unicode. Misalnya ilustrasi atau komik tanpa kata tidak dapat didukung oleh Unicode karena kumpulan mesin terbang tidak terbatas. Anda akan melihat banyak komunikasi bergambar dalam pengaturan internasional seperti bandara, sehingga tidak terbayangkan bahwa ras alien yang bepergian ke luar angkasa akan berevolusi untuk menggunakan bahasa bergambar.

Bahkan jika ras alien memiliki bahasa dengan sistem penulisan dengan serangkaian simbol yang terbatas, sistem ini mungkin tidak dapat didukung di Unicode. Unicode mengharapkan tulisan menjadi urutan simbol linear. Notasi musik adalah contoh dari sistem penulisan yang tidak dapat sepenuhnya direpresentasikan dalam Unicode, karena makna dikodekan dalam pilihan simbol dan penempatan vertikal dan horizontal. (Unicode mendukung simbol musik individu, tetapi tidak dapat menyandikan skor.) Ras alien yang dikomunikasikan menggunakan musik polifonik (tidak jarang) atau saluran komunikasi dengan kompleksitas yang sama, mungkin memiliki sistem penulisan yang mirip dengan skor orkestra, dan Unicode tidak dapat mendukung ini.

Tetapi, demi argumen, anggaplah bahwa semua bahasa, bahkan bahasa asing, dapat diekspresikan sebagai urutan simbol linear yang dipilih dari himpunan terbatas. Apakah Unicode cukup besar untuk invasi alien? Unicode saat ini memiliki kurang dari satu juta titik kode yang belum ditetapkan. Bahasa Cina berisi seratus ribu karakter sesuai dengan kamus Cina paling komprehensif (tidak semua dari mereka saat ini didukung oleh Unicode sebagai karakter yang berbeda). Jadi hanya sepuluh bahasa dengan kompleksitas bahasa Mandarin yang akan menggunakan semua Unicode. Di bumi kita memiliki ratusan sistem penulisan yang berbeda, tetapi untungnya sebagian besar adalah alfabet dan bukan ideografis dan karena itu mengandung sejumlah kecil karakter. Jika semua bahasa tertulis menggunakan ideogram seperti bahasa Cina, Unicode bahkan tidak akan cukup besar untuk bumi. Penggunaan huruf berasal dari ucapan yang hanya menggunakan sejumlah fonem yang terbatas, tetapi itu khusus untuk fisiologi manusia. Jadi, bahkan sebuah planet alien tunggal dengan hanya selusin sistem penulisan ideografis dapat melebihi apa yang dapat didukung Unicode. Sekarang pertimbangkan apakah alien ini sudah menginvasi planet lain sebelum bumi dan memasukkan sistem penulisan mereka dalam serangkaian karakter yang harus didukung.

Perluasan atau modifikasi penyandian saat ini, atau pengenalan penyandian baru tidak akan menyelesaikan ini, karena batasannya adalah dalam jumlah titik kode yang didukung oleh Unicode.

Jadi jawabannya kemungkinan besar tidak.

JacquesB
sumber
5
Anda kurang dalam imajinasi. Koreografer tari memiliki banyak bahasa dan terminologi yang dapat mereka gunakan untuk menggambarkan dan mengajarkan tarian yang harus dilakukan oleh para pemain panggung. Jika kita mempelajari lebah apa yang berkomunikasi, kita pasti bisa menyusun terminologi tertulis untuknya. Lagipula, sebagian besar bahasa tertulis kita saat ini adalah penyandian suara. Gerakan enkode tidak jauh berbeda dari suara enkode.
whatsisname
3
Sebagian dari jawaban ini baik tetapi untuk mengatakan "Tidak hanya tidak memiliki bentuk tertulis, tetapi juga tidak dapat diwakili dalam bentuk tertulis" juga benar-benar salah. Apa pun yang menyampaikan informasi dapat direduksi menjadi bit, dan apa pun yang direduksi menjadi bit dapat diubah menjadi aliran karakter yang Anda sukai.
Steven Burnap
2
@ SvenvenBurnap Benar, tetapi Unicode lebih dari sekedar urutan bit. Ini adalah cara menafsirkan bit-bit itu, yang cukup kaku. Ya, rangkaian karakter Unicode dapat diperluas untuk mewakili apa pun dari gambar ke instruksi CNC, tetapi ini akan menjadi makhluk yang sangat berbeda.
Owen
4
Ingatlah bahwa yang digambarkan oleh simbol unicode (dalam sebagian besar bahasa) adalah pola dalam variasi tekanan udara, dan bahwa untuk sebagian besar bahasa itu benar-benar melakukan pekerjaan yang cukup jelek untuk benar-benar cocok dengan pola-pola itu.
Steven Burnap
3
Jadi maksud Anda kalimat "terbang 45 detik dengan matahari 15 derajat ke kiri, lalu terbang 10 detik dengan matahari 10 derajat ke kanan" tidak mungkin? Tentunya membutuhkan posisi matahari pada saat itu sebagai konteks.
Steven Burnap