UTF-8 işleme
- C kursu
- İleri seviye
- Ders 65/83
- 5 dk
UTF-8 dize işlemeyi öğrenirsin.
UTF-8 kod çözme
UTF-8 kod çözme, bayt dizisini Unicode kod noktasına çevirir. ASCII bayt (0-127) tek başına bir karakterdir. İki baytlık dizi ise 110xxxxx 10xxxxxx biçimindedir; ilk baytın alt 5 biti ile ikinci baytın alt 6 biti birleştirilir.
Örnek: 'ü' harfının UTF-8 baytları 0xC3 0xBC'dir. Çözülüş: ((0xC3 & 0x1F) << 6) | (0xBC & 0x3F) = 0x03 << 6 | 0x3C = 0xFC = 252. Yani 'ü''nün Unicode kod noktası U+00FC'dür.
Kod çözücü işlev
Bir kod çözücü işlevi imzası: unsigned decode_utf8(const char *s). Baytları unsigned char'a cast ederek işliyoruz; böylece işaret genişlemesini önleriz.
Eğer b[0] < 0x80 ise ASCII; doğrudan b[0] döner. Yoksa iki baytlık dizi: ((b[0] & 0x1F) << 6) | (b[1] & 0x3F). Daha uzun diziler üç veya dört baytla benzer şekilde çözülür; bu derste iki bayta odaklanıyoruz. Çıktıyı printf("%u", cp) ile yazdırırız.
Uygulama UTF-8 kod noktası çöz
unsigned decode_utf8(const char *s) işlevini yaz: const unsigned char *b = (const unsigned char *)s;; b[0] < 0x80 ise b[0] döndür; yoksa ((b[0] & 0x1F) << 6) | (b[1] & 0x3F) döndür. main'de unsigned cp = decode_utf8("ü"); ve printf("codepoint: %u\n", cp);.
Başlangıç kodu
#include <stdio.h>
// unsigned decode_utf8(const char *s) işlevini yaz
// ASCII ise b[0] döner; yoksa iki baytlı çöz
// main: "ü" dizesinin kod noktasını çöz ve yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
unsigned decode_utf8(const char *s) {
const unsigned char *b = (const unsigned char *)s;
if (b[0] < 0x80) return b[0];
return ((b[0] & 0x1F) << 6) | (b[1] & 0x3F);
}
int main(void) {
unsigned cp = decode_utf8("ü");
printf("codepoint: %u\n", cp);
return 0;
}Beklenen çıktı
codepoint: 252
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 UTF-8 maskeleme
| Kavram | Anlamı |
|---|---|
0x1F |
İlk bayt maske |
0x3F |
Devam bayt maske |
<< 6 |
Kaydırma |
0x80 |
ASCII sınırı |
2 0xC3 baytı kaç bitlik kod noktası parçası taşır?
- 5 bit Doğru cevap
- 6 bit
- 7 bit
- 8 bit
Açıklama: İlk bayt & 0x1F ile 5 bit alınır.
3 Devam bayt maskele
unsigned cp = ((b[0] & 0x1F) << 6) | (b[1] & ____);
unsigned cp = ((b[0] & 0x1F) << 6) | (b[1] & 0x3F);
Açıklama: 0x3F devam baytın alt 6 bitini alır.