C99 veya öncesi
C standardı (C99) geniş karakterler ve çok baytlı karakterler sağlar, ancak bu geniş karakterlerin ne tutabileceğine dair bir garanti olmadığından, değerleri bir şekilde sınırlıdır. Belirli bir uygulama için yararlı destek sağlarlar, ancak kodunuzun uygulamalar arasında hareket edebilmesi gerekiyorsa, bunların yararlı olacağına dair yeterli garanti yoktur.
Sonuç olarak, Hans van Eck'in önerdiği yaklaşım (ICU - Unicode için Uluslararası Bileşenler - kütüphane etrafına bir sarmalayıcı yazmaktır) sağlam, IMO.
UTF-8 kodlamasının birçok faydası vardır; bunlardan biri, verilerle uğraşmazsanız (örneğin, keserek), UTF-8'in karmaşıklıklarının tam olarak farkında olmayan işlevler tarafından kopyalanabilir. kodlama. Bu kategorik olarak durum böyle değil wchar_t
.
Tam olarak Unicode, 21 bitlik bir formattır. Yani Unicode, U + 0000'den U + 10FFFF'ye kadar kod noktalarını saklar.
UTF-8, UTF-16 ve UTF-32 biçimleriyle ilgili yararlı şeylerden biri (UTF'nin Unicode Dönüştürme Biçimi anlamına gelir - bkz. Unicode ), üç gösterim arasında bilgi kaybı olmadan dönüştürme yapabilmenizdir. Her biri, diğerlerinin temsil edebileceği her şeyi temsil edebilir. Hem UTF-8 hem de UTF-16, çok baytlı biçimlerdir.
UTF-8'in, dizedeki herhangi bir noktadan başlayarak bir dizedeki karakterlerin başlangıcını güvenilir bir şekilde bulmayı mümkün kılan dikkatli bir yapıya sahip çok baytlı bir format olduğu iyi bilinir. Tek baytlık karakterlerin yüksek bit değeri sıfıra ayarlanır. Çok baytlı karakterler, 110, 1110 veya 11110 bit modellerinden biriyle (2 bayt, 3 bayt veya 4 baytlık karakterler için) başlayan ilk karaktere sahiptir ve sonraki baytlar her zaman 10'dan başlar. Devam karakterleri her zaman aralık 0x80 .. 0xBF. UTF-8 karakterlerinin mümkün olan minimum formatta temsil edilmesi gerektiğine dair kurallar vardır. Bu kuralların bir sonucu, 0xC0 ve 0xC1 baytlarının (ayrıca 0xF5..0xFF) geçerli UTF-8 verilerinde görünememesidir.
U+0000 .. U+007F 1 byte 0xxx xxxx
U+0080 .. U+07FF 2 bytes 110x xxxx 10xx xxxx
U+0800 .. U+FFFF 3 bytes 1110 xxxx 10xx xxxx 10xx xxxx
U+10000 .. U+10FFFF 4 bytes 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
Başlangıçta, Unicode'un 16 bitlik bir kod kümesi olacağı ve her şeyin 16 bitlik bir kod alanına sığacağı umuluyordu. Ne yazık ki, gerçek dünya daha karmaşık ve mevcut 21 bit kodlamaya genişletilmesi gerekiyordu.
UTF-16 bu nedenle 'Temel Çok Dilli Düzlem' için tek bir birim (16 bitlik kelime) kod setidir, yani Unicode kod noktalarına sahip karakterler U + 0000 .. U + FFFF, ancak iki birim (32 bit) bu aralığın dışındaki karakterler. Bu nedenle, UTF-16 kodlamasıyla çalışan kod, UTF-8'in gerektiği gibi değişken genişlikli kodlamaları işleyebilmelidir. Çift birimli karakterlerin kodlarına vekiller denir.
Suretler, UTF-16'daki eşleştirilmiş kod birimlerinin baş ve son değerleri olarak kullanılmak üzere ayrılmış iki özel Unicode değer aralığından kod noktalarıdır. Yüksek olarak da adlandırılan öncü temsilciler U + D800'den U + DBFF'ye ve sondaki veya düşük temsilciler U + DC00'den U + DFFF'ye kadardır. Karakterleri doğrudan temsil etmediklerinden, yalnızca bir çift olarak temsil ettikleri için bunlara vekiller denir.
Tabii ki UTF-32 tek bir depolama biriminde herhangi bir Unicode kod noktasını kodlayabilir. Hesaplama için etkilidir, ancak depolama için değildir.
ICU ve Unicode web sitelerinde çok daha fazla bilgi bulabilirsiniz .
C11 ve <uchar.h>
C11 standardı kuralları değiştirdi, ancak tüm uygulamalar şu anda bile (2017 ortası) değişiklikleri yakalayamadı. C11 standardı, Unicode desteğine yönelik değişiklikleri şu şekilde özetler:
- Unicode karakterler ve dizeler (
<uchar.h>
) (orijinal olarak ISO / IEC TR 19769: 2004'te belirtilmiştir)
Aşağıda, işlevselliğin çıplak bir taslağı verilmiştir. Spesifikasyon şunları içerir:
6.4.3 Evrensel karakter adları
Sözdizimi
evrensel karakter-adı:
\u
onaltılı-dörtlü
\U
onaltılı-dörtlü onaltılı-dörtlü
onaltılı:
onaltılık basamaklı onaltılık basamaklı onaltılık basamaklı onaltılık basamak
7.28 Unicode yardımcı programları <uchar.h>
Başlık <uchar.h>
, Unicode karakterlerini işlemek için türleri ve işlevleri bildirir.
Bildirilen türler mbstate_t
(7.29.1'de açıklanmıştır) ve size_t
( 7.19'da açıklanmıştır);
char16_t
16 bitlik karakterler için kullanılan işaretsiz bir tamsayı türüdür ve aynı türdür uint_least16_t
(7.20.1.2'de açıklanmıştır); ve
char32_t
32 bitlik karakterler için kullanılan işaretsiz bir tamsayı türüdür ve aynı türdür uint_least32_t
(ayrıca 7.20.1.2'de açıklanmıştır).
(Çapraz başvurular çevrilmesi: <stddef.h>
tanımlarınızı size_t
,
<wchar.h>
tanımlarınızı mbstate_t
ve <stdint.h>
tanımlarınızı uint_least16_t
ve uint_least32_t
.) <uchar.h>
Başlık da (yeniden başlatılabilir) dönüştürme işlevleri en az sayıda tanımlar:
mbrtoc16()
c16rtomb()
mbrtoc32()
c32rtomb()
\unnnn
Veya \U00nnnnnn
gösterimleri kullanılarak tanımlayıcılarda hangi Unicode karakterlerinin kullanılabileceği hakkında kurallar vardır . Tanımlayıcılarda bu tür karakterlerin desteğini aktif olarak etkinleştirmeniz gerekebilir. Örneğin, GCC -fextended-identifiers
, tanımlayıcılarda bunlara izin vermeyi gerektirir .
MacOS Sierra'nın (10.12.5) tek bir platforma ad vermek için desteklemediğini unutmayın <uchar.h>
.