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.
sumber
Jawaban:
Elixir , 69 byte
Cobalah online!
Menggunakan fungsi validasi string bawaan. Mengambil input sebagai biner Elixir.
sumber
APL (Dyalog Unicode) ,
4139 byte SBCSFungsi awalan diam-diam anonim. Mengambil string Unicode sebagai argumen di mana poin kode karakter mewakili byte input.
Cobalah online!
'À\x80'⎕R⎕A
R eplaceC0 80
s dengan huruf besar A lphabet{
...}
terapkan fungsi anonim berikut, di mana argumennya adalah⍵
:0::
jika terjadi kesalahan:0
mengembalikan nol⋄
mencoba:⎕UCS⍵
konversikan string ke poin kode'UTF-8'⎕UCS⍣2
menafsirkan sebagai UTF-8 byte dan mengonversi teks yang dihasilkan kembali ke byte⌊/
byte terendah (nol jika null byte hadir, positif jika tidak, "infinity" jika string kosong)×
tanda (nol jika null byte hadir, satu jika tidak)sumber
D9 C0 80 84 C0 80 10
?C0 80
membuat byte yang tidak terkait berbatasan dengan cara yang valid, meskipun tidak valid saat dipisahkan? Sunting: Diperbarui untuk memperbaikinya tanpa biaya byte.Python 2 ,
104102 byteCobalah online!
Keluaran melalui kode keluar
sumber
Karat -
191 byte313 bytePer komentar di bawah yang asli tidak berfungsi dengan baik. Versi baru dan lebih baik. Tidak ada perpustakaan yang digunakan, karena Perkasa Perkasa Tidak Perlu Untuk Anda dan Perpustakaan Anda. Kode ini menggunakan pencocokan pola dengan mesin negara. Dengan tanpa malu-malu merobek spec UTF8 , setelah menemukannya melalui referensi dan diskusi oleh Jon Skeet , kita dapat menyalin spec hampir karakter untuk karakter ke blok pencocokan pola karat. Pada akhirnya, kami menambahkan persyaratan Mutf8 khusus Beefster untuk C0 80 agar dianggap valid. Tidak Disatukan:
coba di taman bermain karat
sumber