UTF-8 , Unicode kod noktalarını Unicode farkında olmayan kodu kolayca karıştırmayacak şekilde değişken genişlikli bir formatta kodlamanın nispeten basit bir yoludur.
UTF-8'e genel bakış
- 1-0x7F aralığındaki baytlar (dahil) normalde geçerlidir
- Bit örüntüsüne
10XX XXXX
sahip baytlar, bir kod noktasının bir kısmını kodlamak için en az altı önemli bit kullanıldığında devam baytları olarak kabul edilir. Önceki bir bayt tarafından beklenmedikçe bunlar görünmemelidir. - Desenli baytlar
110X XXXX
daha sonra bir devam baytını bekler - Desenli
1110 XXXX
baytlar daha sonra iki devam baytı bekler - Desenli
1111 0XXX
baytlar daha sonra üç devam bayt bekler - Diğer tüm baytlar geçersizdir ve UTF-8 akışında hiçbir yerde görünmemelidir. Teoride 5, 6 ve 7 bayt kümeleri mümkündür, ancak bu meydan okuma için izin verilmez.
Uzun kodlamalar
UTF-8 ayrıca bir kod noktasının minimum bayt sayısıyla temsil edilmesini gerektirir. Daha az bayt ile temsil edilebilecek bayt dizileri geçerli değildir. Değiştirilmiş UTF-8, boş karakterler (U + 0000) için C0 80
(onaltılık gösterim) olarak temsil edilmesi gereken bir istisna ekler ve bunun yerine, boş baytların akışta herhangi bir yerde görünmesine izin vermez. (Bu, boş sonlandırılmış dizelerle uyumlu olmasını sağlar)
Meydan okuma
Bir bayt dizesi verildiğinde, bu dizenin geçerli Değiştirilmiş UTF-8'i temsil edip etmediğini belirleyecek ve geçerliyse bir doğruluk değeri ve aksi takdirde bir falsy değeri döndürecek bir program yapacaksınız. Uzun kodlamaları ve boş baytları kontrol etmeniz gerektiğini unutmayın (çünkü bu Modifiye UTF-8'dir). UTF-8 değerlerini deşifre etmenize gerek yoktur.
Örnekler
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')
kurallar
- Standart kurallar ve boşluklar geçerlidir
- İşaretsiz bayt aralığındaki (0-255) tüm değerler okunabildiği sürece giriş ve çıkış herhangi bir uygun biçimde olabilir.
- Boş sonlandırılmış bir dize yerine bir dizi veya dosya kullanmanız gerekebilir. Boş baytları okuyabilmeniz gerekir.
- En kısa kod kazanır!
- UTF-8'in kodunu çözmek için yerleşiklerin kullanılmasının, burada verilen gereksinimlere uygunluğu garanti edilmediğini unutmayın. Etrafında çalışmanız ve özel durumlar oluşturmanız gerekebilir.
EDIT: UTF-8 kodunu çözen yerleşikleri kullanmamanız için bonus eklendi
EDIT2: yalnızca Rust yanıtı nitelikli olduğu ve tanımlanması garip olduğu için bonus kaldırıldı.