CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
unsigned cp = ((b[0] & 0x1F) << 6) | (b[1] & ____);
Cevap
unsigned cp = ((b[0] & 0x1F) << 6) | (b[1] & 0x3F);

Açıklama: 0x3F devam baytın alt 6 bitini alır.

İleri seviye bölümündeki tüm dersler