UTF-8 adalah cara yang relatif sederhana untuk menyandikan titik kode Unicode dalam format lebar variabel sehingga tidak mudah membingungkan kode yang tidak disadari Unicode.
Ikhtisar UTF-8
- Byte dalam kisaran 1-0x7F, inklusif, biasanya valid
- Bytes dengan pola bit
10XX XXXX
dianggap sebagai byte lanjutan, dengan enam bit paling tidak signifikan yang digunakan untuk mengkodekan bagian dari codepoint. Ini tidak boleh muncul kecuali mereka diharapkan oleh byte sebelumnya. - Bytes dengan pola
110X XXXX
mengharapkan satu byte kelanjutan sesudahnya - Bytes dengan pola
1110 XXXX
mengharapkan dua byte lanjutan setelahnya - Bytes dengan pola
1111 0XXX
mengharapkan tiga byte lanjutan setelahnya - Semua byte lainnya tidak valid dan seharusnya tidak muncul di mana pun dalam aliran UTF-8. Cluster 5, 6, dan 7 byte dimungkinkan secara teori, tetapi tidak akan diizinkan untuk keperluan tantangan ini.
Pengkodean terlalu lama
UTF-8 juga mensyaratkan bahwa codepoint harus diwakili dengan jumlah byte minimum. Urutan byte apa pun yang dapat diwakili dengan byte lebih sedikit tidak valid. UTF-8 yang dimodifikasi menambahkan satu pengecualian untuk ini untuk karakter nol (U + 0000), yang harus direpresentasikan sebagai C0 80
(representasi hex)), dan sebagai gantinya melarang byte nol muncul di mana saja di aliran. (Ini membuatnya kompatibel dengan string yang diakhiri null)
Tantangan
Anda harus membuat program yang, ketika diberi string byte, akan menentukan apakah string tersebut mewakili UTF-8 yang Dimodifikasi yang valid dan akan mengembalikan nilai kebenaran jika valid dan nilai falsy sebaliknya. Perhatikan bahwa Anda harus memeriksa penyandian yang terlalu lama dan byte nol (karena ini Dimodifikasi UTF-8). Anda tidak perlu mendekodekan nilai UTF-8.
Contohnya
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
Aturan
- Aturan dan celah standar berlaku
- Input dan output dapat dalam format apa pun asalkan semua nilai dalam rentang byte yang tidak ditandatangani (0-255) dapat dibaca.
- Anda mungkin perlu menggunakan array atau file daripada string yang diakhiri dengan nol. Anda harus bisa membaca byte nol.
- Kode terpendek menang!
- Perhatikan bahwa menggunakan bawaan untuk mendekode UTF-8 tidak dijamin untuk memenuhi persyaratan yang diberikan di sini. Anda mungkin perlu mengatasinya dan membuat case khusus.
EDIT: bonus tambahan untuk tidak menggunakan builtin yang memecahkan kode UTF-8
EDIT2: menghapus bonus karena hanya jawaban Rust yang memenuhi syarat dan aneh untuk didefinisikan.