X'te karakter sayma neden.length ile çalışmıyor

X'te (eski adıyla Twitter) bir mesaj yazarken gördüğün karakter sayacı aslında çok basit değil. Eğer JavaScript'te `str.length` kullanırsan, gerçek X ağırlıklandırmasını hiç yakalamayacaksın.

Sorun şu: JavaScript dizileri UTF-16 kullanıyor. Bir görsel karakter birden fazla kod noktasından oluşabilir. Mesela emoji "" (aile) tek bir glyph gibi görünse de, aslında birkaç kod noktasının birleşimi. X bunu 2 ağırlık birimi olarak sayar, ama `.length` sana 25 verir.

Örnekler somutlaştırsın: "Hello world" 11 ağırlık karakteridir. Ama "中文" (Çince) sadece 2 görsel glyph'tir, fakat X'te 4 ağırlık birimi sayılır. URL'ler de özel muamele görür, "https://example.com" tam 23 karakter değil, X tarafından sabit 23 ağırlık olarak tanınır.

X'in açık kaynak twitter-text kütüphanesi bu sorunu çözmek için var. twitter-text kullanırsan:

1import twitterText from 'twitter-text';
2const result = twitterText.parseTweet('中文 https://example.com');
3console.log(result.weightedLength); // Doğru ağırlık

Bu referans parser, X'in gerçek zamanında her hesap için ne yaptığını tam olarak yansıtmayabilir, özellikle premium uzun gönderi özellikleri için. Ama standart gönderi sayımı için güvenilir.

Eğer kendi karakter sayacını yazacaksan, görsel uzunluk, URL sayısı, emoji sayısı ve X ağırlıklandırmasını ayrı ayrı takip etmek gerekir. Sadece `.length` kullanmak, kullanıcıya yanlış bilgi verir.

konu hakkında tepkinizi verebilirsiniz