Unicode dönüştürücülerde basit matematik neden başarısız olur

Geçen hafta sonu Unicode'un derinliklerine düştüm. Fraktur, çift vuruşlu, çemberli ve estetik biyografi glifleri oluşturan istemci taraflı bir metin şekillendirici geliştiriyordum, hiç dış kütüphane kullanmadan. Yolda iki ciddi teknik tuzağa çarptım; ikisini de paylaşmak istiyorum.

İlk sorun şu: standart ASCII karakterlerini (A-Z gibi) stilize Unicode varyantlarına (𝔸, 𝔹, ℂ) dönüştürmeye çalışırken, çoğu mühendis basit matematiksel ofset hesaplaması yapar:

1const targetCodePoint = 0x1D538 + (char.charCodeAt(0) - 65);
2return String.fromCodePoint(targetCodePoint);

Bu çalışmıyor çünkü Unicode'un Mathematical Alphanumeric Symbols bloğu (U+1D400..U+1D7FF) tarihsel "boşluklara" sahip. Double-Struck C (ℂ, U+2102), H (ℍ, U+210D), N (ℕ, U+2115), P (ℙ, U+2119), Q (ℚ, U+211A), R (ℝ, U+211D) ve Z (ℤ, U+2124) gibi karakterler belirli stil bloklarında eksik. Bunlar eski matematiksel sembol standartlarından önceki tanımlarına sahip ve başka yerlerde yaşıyor.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Doğru çözüm: harfleri açıkça eşleştiren bir arama tablosu (lookup table) kullanmak. Her stil için sabit bir dizi tanımla:

1const doubleStruck = {
2'A': '𝔸', 'B': '𝔹', 'C': 'ℂ', 'D': '𝔻', 'E': '𝔼',
3'H': 'ℍ', 'N': 'ℕ', 'P': 'ℙ', 'Q': 'ℚ', 'R': 'ℝ', 'Z': 'ℤ'
4};
5
6const convertChar = (char, style) => style[char] || char;

İkinci tuzak: kontrol karakterleri ve kombinasyon işaretleri. Unicode, tek bir görsel "harf" için birden fazla kod noktası kullanabilir. Örneğin bazı aksan işaretleri ayrı karakterler. Bir karakteri dönüştürürken `char.charCodeAt(0)` yalnızca ilk kod noktasını yakalar; geri kalanını yok sayar. Bunun yerine `String.fromCodePoint()` ile tüm kod noktalarını işle veya Unicode Normalization (NFD/NFC) kullan.

Kütüphanesiz yapı bir bonus: hiçbir bağımlılık, hiçbir build step, tarayıcı doğrudan çalıştırır. Ama bu, Unicode'un tüm köşelerini bilmen gerektiği anlamına da geliyor. Offset hesaplamalarına güvenme, her stil bloğunun kendine göre kuralları var ve tarihsel istisnaları vardır. Arama tablosu daha uzun görünse de, hata yapma olasılığı sıfır.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz