Karakter ve Kelime Sayacı
Karakter, kelime, cümle ve okuma süresini sayın; meta başlık, açıklama ve sosyal medya sınırlarını canlı görün. Emojileri tek karakter sayar, UTF-16 birimi olarak değil.
Sayımlar
Okuma süresi, dakikada 200 kelimelik sessiz okuma hızı varsayılarak hesaplanır.
Görünen karakter, kullanıcının tek harf saydığı birimdir. Bir emoji ailesi ya da bayrak, karakter sayımında birden çok birim tutar ama görünen karakter olarak birdir.
Uzunluk sınırları
Arama motoru sınırları kesin kural değil, kırpılma noktasıdır: daha uzun bir başlık reddedilmez, sonuç sayfasında üç noktayla kesilir. Tweet sınırı ise gerçek bir üst sınırdır.
Özet (TL;DR)
- Türkçe metinde karakter sayısı ile bayt sayısı aynı değil: "ş" bir karakter ama iki bayt tutar.
- Emoji sayarken JavaScript yanıltır. "👨👩👧".length sonucu 8 verir, oysa ekranda tek bir simge vardır.
- Veritabanında VARCHAR(50) tanımı çoğu kurulumda 50 karakter değil, 50 bayt anlamına gelir.
- Meta başlık ve açıklama sınırları karakterle değil piksel genişliğiyle ölçülür; buradaki sayılar güvenli bir yaklaşıklıktır.
Karakter saymak neden göründüğünden zor
Bir metin kutusuna yazdığınız şeyi saymak ilk bakışta metin.length kadar basit görünüyor. İngilizce yazdığınız sürece de öyle. Sorun, Türkçe yazmaya başladığınızda ya da araya bir emoji girdiğinizde çıkıyor: aynı ifade artık üç farklı sayı üretiyor ve hangisinin doğru olduğu, sayıyı nerede kullandığınıza bağlı.
Bu araç üç sayıyı da ayrı ayrı gösteriyor. Hangisine bakmanız gerektiğine karar vermek için önce farkın nereden geldiğini bilmek gerekiyor.
Karakter, kod birimi ve grafem farkı
JavaScript metinleri UTF-16 kod birimleriyle tutar. length size karakter sayısını değil, o kod birimlerinin sayısını verir. Latin harfleri için ikisi aynı çıkar, o yüzden fark uzun süre gözden kaçar:
'merhaba'.length // 7, beklendiği gibi'ş'.length // 1, burada da sorun yok '👋'.length // 2 <-- tek simge, iki kod birimi'👨👩👧'.length // 8 <-- tek simge, sekiz kod birimi // Ekranda görünen birimi saymak istiyorsanız Intl.Segmenter gerekiyorconst seg = new Intl.Segmenter('tr', { granularity: 'grapheme' });[...seg.segment('👨👩👧')].length // 1Ekranda görünen o tek birimin adı grafem. Kullanıcı "kaç karakter yazdım" diye sorduğunda kastettiği şey neredeyse her zaman grafem sayısıdır. Bu araç grafemleri Intl.Segmenter ile sayıyor, desteklenmeyen bir tarayıcıda ise kod noktalarına düşüyor.
Bayt sayısı ne zaman önemli olur
Karakter sayısı ekran için, bayt sayısı depolama için geçerli. UTF-8 kodlamasında ASCII harfleri bir bayt tutar, Türkçe karakterler iki bayt, çoğu emoji dört bayt. Bu fark veritabanı sınırlarında karşınıza çıkıyor:
| Metin | Karakter | Bayt |
|---|---|---|
| merhaba | 7 | 7 |
| Kürşad | 6 | 9 |
| İstanbul | 8 | 9 |
| 👋 | 1 | 4 |
Uyarı
VARCHAR(50) tanımı, sütunun karakter kümesine göre davranır ve eski utf8 kümesinde dört baytlık karakterleri hiç saklayamaz. Emoji içeren bir alanda utf8mb4 kullanmanız gerekir. PostgreSQL varchar(n) sınırını karakterle sayar, o yüzden aynı sorunu yaşamazsınız.SEO sınırları ve piksel genişliği meselesi
Meta başlık için 60, açıklama için 155 ila 160 karakter gibi sayılar dolaşıyor. Bu sayılar işe yarıyor ama arama motorunun gerçekte ölçtüğü şey karakter değil, piksel genişliği. Bir "i" ile bir "M" aynı yeri kaplamıyor, dolayısıyla 60 karakterlik iki başlıktan biri tam sığarken diğeri kesilebiliyor.
Pratik yaklaşım şu: sayacı bir sınır değil bir uyarı olarak kullanın. Sınıra yaklaştığınızda önemli kelimeyi başa alın, böylece kesilme olsa bile anlam ayakta kalır.
Kelime sayımında Türkçe ayrıntısı
Kelime saymak boşluklardan bölmek gibi görünse de Türkçe'de kesme işareti araya giriyor. "Türkiye'nin" tek kelimedir; kesme işaretinden bölen bir sayaç bunu iki kelime sayar ve uzun metinlerde fark birikir. Bu araç kesme işaretini kelime içinde kabul ediyor, ancak alıntı işareti olarak kullanıldığı durumları ayırt ediyor.
Okuma süresi hesabı da kelime sayısına dayanıyor. Dakikada 200 kelime kabul ediyorum; teknik metinlerde gerçek hız bunun altında kalır, o yüzden çıkan süreyi alt sınır olarak okumak daha doğru.
Sıkça Sorulan Sorular
- Yazdığım metin bir yere gönderiliyor mu?
- Hayır. Sayım tamamen tarayıcınızda çalışan JavaScript ile yapılıyor. Sayfa açıldıktan sonra internet bağlantınızı kesseniz bile araç çalışmaya devam eder.
- Neden emoji birden fazla karakter sayılıyor?
- Çünkü "karakter" kelimesi iki farklı şeyi anlatıyor. JavaScript UTF-16 kod birimini sayar, siz ekranda gördüğünüz simgeyi kastediyorsunuz. Araçta ikisi ayrı satırlarda gösteriliyor: ekrandaki simge sayısı için grafem satırına bakın.
- Meta açıklamam kaç karakter olmalı?
- Masaüstünde yaklaşık 155 ila 160 karakter güvenli bir aralık, mobilde daha kısa kesiliyor. Ama Google açıklamayı çoğu zaman kendi seçtiği bir metinle değiştiriyor, bu yüzden sayıyı tutturmak için cümleyi bozmaya değmez.
- Karakter sayısı ile bayt sayısı neden farklı?
- UTF-8 kodlaması her karakteri aynı boyutta saklamıyor. ASCII harfleri bir bayt, Türkçe karakterler iki bayt, emojiler genellikle dört bayt tutuyor. Bir karakter sınırı veritabanı sütununa yazılacaksa bayt sayısına bakmanız gerekir.
- Okuma süresi nasıl hesaplanıyor?
- Kelime sayısı dakikada 200 kelime kabul edilerek bölünüyor. Bu ortalama bir okuma hızı; kod bloğu içeren teknik metinlerde gerçek süre daha uzun olur.