Ayrıca bkz. Çince karakterler içeren bir dosya, karakter başına kaç bayt kullanılacağını nasıl bilir? - Hiç şüphe yok ki, yardımcı olabilecek başka SO soruları da var.
UTF-8'de aşağıdaki bayt türlerini alırsınız:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(Son satır, 0xF0..0xF7'yi okuması gerektiği gibi görünür; ancak, 21 bitlik Unicode aralığı (U + 0000 - U + 10FFFF), maksimum geçerli değerin 0xF4 olduğu; 0xF5..0xF7 değerlerinin geçerli UTF-8.)
Belirli bir bayt dizisinin geçerli UTF-8 olup olmadığına bakmak, şunları düşünmeniz gerektiği anlamına gelir:
- Beklenmeyen yerlerde görünen devam baytları
- Devam baytının beklendiği yerde görünen devam etmeyen baytlar
- Dizenin sonunda eksik karakterler ('devam baytı bekleniyor' varyasyonu)
- Minimal olmayan diziler
- UTF-16 vekiller
Geçerli UTF-8'de, 0xF5..0xFF baytları oluşamaz.
Minimal olmayan diziler
Bazı karakterler için birden fazla olası temsil vardır. Örneğin, Unicode karakteri U + 0000 (ASCII NUL) şu şekilde temsil edilebilir:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Bununla birlikte, Unicode standardı, son üç alternatifin minimum olmadıkları için kabul edilemez olduğunu açıkça belirtir. Bu durumda, 0xC0 ve 0xC1 baytları hiçbir zaman geçerli UTF-8'de görünemez çünkü bunlar tarafından kodlanabilen karakterler yalnızca 0x00..0x7F aralığında tek baytlı karakterler olarak minimum düzeyde kodlanmıştır.
UTF-16 Suretleri
Temel Çok Dilli Düzlem (BMP) içinde, Unicode değerleri U + D800 - U + DFFF, UTF-16 yedekleri için ayrılmıştır ve geçerli UTF-8'de kodlanmış görünemez. UTF-8'de geçerli olsaydı (ki vurguluyorum, değildir), o zaman vekiller kodlanacaktı:
- U + D800 - 0xED 0xA0 0x80 (en küçük yüksek vekil)
- U + DBFF - 0xED 0xAF 0xBF (en büyük yüksek vekil)
- U + DC00 - 0xED 0xB0 0x80 (en küçük düşük vekil)
- U + DFFF - 0xED 0xBF 0xBF (en büyük düşük vekil)
Kötü Veri
Dolayısıyla, KÖTÜ verileriniz bu çeşitli reçeteleri ihlal eden örnekler içermelidir.
- Başlangıç bayt değerlerinden birinin önünde olmayan devam baytı
- Çok karakterli ilk baytların ardından yeterli devam baytı gelmiyor
- Minimal olmayan çok baytlı karakterler
- UTF-16 vekiller
- Geçersiz baytlar (0xC0, 0xC1, 0xF5..0xFF).
Bir bayt sırası işareti (BOM) U + FEFF, yani sıfır genişlikli bölünmez boşluk (ZWNBSP), UTF-8'de kodlanmamış görünemez - geçerli UTF-8'de 0xFF ve 0xFE baytlarına izin verilmez. Kodlanmış bir ZWNBSP, bir UTF-8 dosyasında 0xEF 0xBB 0xBF olarak görünebilir, ancak BOM UTF-8'de tamamen gereksizdir.
Bazıları da vardır noncharacters Unicode. U + FFFE ve U + FFFF bu tür iki karakter dışıdır (ve her düzlemdeki son iki kod noktası, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF diğerleri ). Bunlar normalde veri alışverişi için Unicode verilerinde görünmemelidir, ancak özel kullanımda görünebilir. Unicode'daki karakter olmayan karakterlerin oldukça karmaşık geçmişi de dahil olmak üzere birçok kötü ayrıntı için Unicode SSS bağlantısına bakın. ( Corrigendum # 9: Clarification About Noncharacters , Ocak 2013'te yayınlandı, başlığının önerdiği şeyi yapıyor - karakter olmayanların anlamını açıklıyor.)