Amaç, UTF SSS bölümünde verilen resmi Unicode kodlamaları arasında tam uyumlu bir dönüştürücü oluşturmaktır . Bu Unicode merkezli olduğu göz önüne alındığında, dahil kodlamalar mümkün olan en iyi kullanarak en düşük bayt sayısı ile cevap kabul edecek (belki APL programlamak sürece muhtemelen UTF-8 olacak). Uzun yazı için özür dilerim, ancak birçoğu resmi şartnamede (pdf, bölüm 3.9 D90 - D92) veya Wikipedia'da da erişilebilen kodlamaları açıklıyor .
Özellikler
Seçim diliniz herhangi bir zamanda bir gereksinimi tam olarak karşılayamıyorsa, bunu verilen kuralların ruhuna yapışan bir şeyle değiştirin. Örneğin. her dilde yerleşik diziler, işlevler vb. bulunmaz.
Dize kitaplıkları / işlevleri kullanma veya kitaplıkları / işlevleri kodlama yok. Bu kod golfünün amacı dönüştürücüyü bit / bayt manipülasyonu kullanarak uygulamaktır. Dizeleri kendi kapasitelerinde karakter veya bayt dizisi olarak kullanmaya izin verilir. Oh, ve dönüşümü yapan OS çağrıları da yok.
Dönüştürücü üç parametre alacak bir fonksiyondur: kodlanmış giriş dizesini temsil eden bir bayt dizisi ve sayı olarak temsil edilen "giriş" ve "çıkış" kodlamaları. Keyfi olarak
UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, and UTF32LE
, bu sırayla 0 ila 6 arasında sayılar atayacağız . Numaranın olup olmadığını kontrol etmeye gerek yoktur,< 0
ya da> 6
bu parametrelerin doğru olduğunu varsayacağız. Dönüştürücü, istenen çıkış kodlamasında geçerli bir bayt dizisi döndürür.Null karakterini (
U+0000
) dize sonlandırıcı olarak kullanacağız . Bundan sonraki hiçbir şey önemli değil. Giriş dizisinin bir yerde boş karakterine sahip olduğunu varsayacağız, böylece sınır kontrolü yapmanız gerekmez.Gereğince SSS giriş bayt dizisi onun beyan kodlama için geçersizse, biz bir hata olarak bildirmelidir. Bunu aşağıdaki yollardan biriyle yapacağız: programı çökertme, bir istisna atma, null döndürme veya ilk dört baytın tümü 0 olan bir dizi döndürme (böylece
U+0000
her kodlamada olduğu gibi tanınabilir ).
Kodlamalar
Resmi şartnamelere uyulmalıdır, ancak Wikipedia kodlamalar hakkında iyi bir açıklama sağlar (ve doğru olduğuna inandığım kadarıyla) ve tamlık için burada özetleyeceğim. UTF-16 ve UTF-32'nin endianite için varyantları olduğuna dikkat edin .
UTF-32, UTF-32LE, UTF-32BE
En basit kodlama olan her kod noktası, sayısal değerine eşit 4 baytta kodlanır. LE / BE endianlığı temsil eder (küçük endian / büyük endian).
UTF-16, UTF-16LE, UTF-16BE
Kaynak kodları U+0000 - U+FFFF
sayısal değerine eşit 2 bayt olarak kodlanır. Büyük değerler, ayrılmış değerler olan bir çift taşıyıcı kullanılarak kodlanır U+D800 - U+DFFF
. Bu nedenle, daha büyük noktaları kodlamak U+FFFF
için aşağıdaki algoritma kullanılabilir (utanmadan Wikipedia'dan kopyalanır ):
- 0x010000 kod noktasından çıkarılır ve 0..0x0FFFFF aralığında 20 bit bir sayı kalır.
- 0xD800'e ilk on bit (0..0x03FF aralığında bir sayı) eklenir ve 0xD800..0xDBFF [...] aralığında olacak ilk kod birimini veya potansiyel vekili temsil eder.
- En düşük on bit (ayrıca 0..0x03FF aralığında) 0xDC00'e eklenir ve 0xDC00..0xDFFF aralığında olacak ikinci kod birimi veya iz vekilini verir [...].
UTF-8
Kaynağından gelen kod noktaları U+0000 - U+007F
, sayısal değerine eşit 1 bayt olarak kodlanır. Gönderen U+0080 - U+07FF
onlar kodlanmıştır 110xxxxx 10xxxxxx
, U+0800 - U+FFFF
olduğu 1110xxxx 10xxxxxx 10xxxxxx
, daha yüksek değerlerdir 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
. x
Sitesindeki bir kod noktası sayısal değerden bittir.
BOM
Bayt sırası işareti (BOM, U+FEFF
) endianizmi belirtmek için ilk kod noktası olarak kullanılır. Malzeme Listeleri ile ilgili SSS yönergelerini izleyerek Malzeme Listesi aşağıdaki gibi kullanılacaktır: Çünkü UTF-8, UTF-16 and UTF-32
isteğe bağlıdır. Malzeme Listesinde yoksa UTF-16
veya UTF-32
büyük endian olduğu varsayılır. BOM olmamalıdır görünür UTF-16LE, UTF-16BE, UTF-32LE and UTF-32BE
.
Geçersiz UTF'ye Neden Olan Yaygın Tuzaklar
Çeşitli şeyler bir bayt dizisinin geçersiz UTF olmasına neden olabilir.
- UTF-8 ve UTF-32: Doğrudan yedek kod noktalarını (
U+D800 - U+DFFF
) veya daha büyük kod noktalarını doğrudan kodlamaU+10FFFF
. - UTF-8: Birçok geçersiz bayt dizisi.
- UTF-16: Eşleştirilmemiş veya yanlış eşleştirilmiş taşıyıcılar.
- BOM: Kodlama bölümünde belirtildiği gibi kullanılmalıdır. Çıktı alırken
UTF-16
veyaUTF-32
(doğal bir endianness belirtilmediğinde) seçebileceğinizi, ancak küçük endian ile Malzeme Listesini eklemeniz gerektiğini unutmayın .
Karakter olmayan ve atanmamış kod noktalarının (her ikisi de taşıyıcılardan farklı) normal karakterler gibi ele alınacağını unutmayın.
''⎕R''⍠'InEnc' 'UTF16BE' 'OutEnc' 'UTF8-BOM'
,.