Unicode karakter inceleyici
Metni, adları, kategorileri, blokları ve kodlamalarıyla kod noktalarına ayırır ve görünmez, çift yönlü (bidi) ve benzer görünen karakterleri işaretler.
Bu araç ne yapar
Herhangi bir metin yapıştırın, gerçekte oluştuğu tek tek karakterlere ayrılmış olarak geri gelir. Her biri Unicode adını, U+ numarasını, ne tür bir karakter olduğunu, hangi yazı sistemine ve bloğa ait olduğunu, UTF-8 ve UTF-16’da kapladığı baytları ve altı farklı biçimde ihtiyaç duyduğu kaçış dizisini alır.
Çoğu kişi buraya bir şey tutmadığı için gelir. Bir dize göründüğünden uzundur, aynı görünen iki değer eşit karşılaştırılmayı reddeder, bir kullanıcı adı düz harf gibi görünen karakterler için reddedilmiştir ya da bir kaynak kod satırı davrandığından farklı okunur. Dördü de aynı şekle sahiptir: ekranın göstermediği bir şey yapan bir karakter.
Karakterler, kod noktaları ve grafemler
«karakter» sözcüğü en az üç farklı şey ifade eder ve onları karıştırmak, çoğu Unicode kafa karışıklığının başladığı yerdir. Bir kod noktası, Unicode standardında bir değerdir, U+0041 ya da U+1F600 olarak yazılır. Bir grafem, bir okurun tek karakter olarak saydığıdır. Sıklıkla aynı sayı değildirler.
- Düz bir «a», 1 grafem, 1 kod noktası, 1 UTF-16 birimidir — her şey uyuşur.
- U+00E9, önceden bileşik e-acute, 1 grafem, 1 kod noktası, 1 UTF-16 birimidir.
- U+0065 U+0301, aynı harfin e artı birleştirici bir aksan olarak yazılmışı, 1 grafemdir ama 2 kod noktası ve 2 UTF-16 birimidir.
- U+1F600, sırıtan surat, 1 grafem ve 1 kod noktasıdır ama 2 UTF-16 birimidir — BMP’nin üstünde yaşar, bu yüzden JavaScript onu bir vekil çifti olarak saklar.
- Aile emojisi 1 grafem, 5 kod noktası ve 8 UTF-16 birimidir: iki görünmez birleştiriciyle bağlanmış üç kişi.
Aile emojisi insanları yakalayan durumdur. Tek bir şey gibi görünür, JavaScript uzunluğunu 8 olarak bildirir ve 5 karakterlik bir veritabanı sütunu onu tutmaz. Bu araç kod noktalarını oluşturdukları grafemin altında gruplar; böylece iki okuma kafanızda uzlaştırılmak zorunda kalmak yerine aynı anda görünür.
Göremediğiniz karakterler
Şaşırtıcı sayıda Unicode karakteri hiçbir şey çizmez. Çevrelerindeki metnin nasıl davrandığını denetlemek için varlar ve hiçbir iz bırakmadıkları için, kimse fark etmeden kopyalamadan, yapıştırmadan ve incelemeden sağ çıkarlar. Araç bunları yalnızca listelemek yerine işaret eder:
- Sıfır genişlikli boşluk, birleştirici ve birleştirmeyen (U+200B, U+200D, U+200C) — genişlik yok, iz yok ve dokundukları her dize karşılaştırmasını bozarlar.
- Yumuşak tire (U+00AD) — bir kelimenin nerede bölünebileceğine dair bir öneri, bölünene dek görünmez.
- Bölünmez boşluk (U+00A0) — tam olarak bir boşluk gibi görünür ve farklı bir karakterdir; yapılandırma dosyalarında bu kadar uzun süre sağ çıkmasının nedeni budur.
- Bayt sırası işareti (U+FEFF) — çoğu zaman bir dosyanın başında bırakılır, orada ilk değerin görünmez ilk karakteri olur.
- Bidi denetimleri ve geçersiz kılmaları (U+202A’dan U+202E’ye, U+2066’dan U+2069’a) — çevrelerindeki metni yeniden sıralarlar.
Bidi denetimleri kendi anımlarını hak eder. İbranice ve Arapça’nın Latin metinle doğru karıştırılabilmesi için eklendiler ve o işi iyi yaparlar. Ama bir yorumun ya da bir dize değişmezinin içine yerleştirilen bir geçersiz kılma, bir kaynak kod satırının derleyicinin okuduğu sıradan tümüyle farklı bir sırada görünmesine neden olabilir — bu da bir inceleyicinin bambaşka bir şey yapan kodu onaylayabileceği anlamına gelir. O sınıf numara Trojan Source olarak bilinir ve bu aracın her bidi denetimini diğer görünmez karakterlerden ayrı işaretlemesinin nedeni budur.
Benzer görünen karakterler ve karışık betikler
Unicode, ASCII harfleriyle görsel olarak özdeş olan ve onlar olmayan birçok karakter içerir. Kiril а, Yunan ο ve Latin a farklı kod noktalarını işgal eder ve çoğu yazı tipinde aynı işlenir. Onlardan kurulmuş bir alan adı ya da bir kullanıcı adı doğru görünür ve başka bir yeri gösterir.
Her ASCII olmayan benzeri işaretlemek yararsız olurdu: her Rusça, Yunanca ya da İbranice kelimeyi kırmızıya boyardı ve sıradan metinde tetiklenen bir uyarı, insanların atlamayı öğrendiği bir uyarıdır. Bu yüzden buradaki kural, Unicode güvenlik standardının kullandığıdır — bir kelime, içindeki harfler birden çok yazı sisteminden geldiğinde şüphelidir:
- Tümüyle Latin harfleriyle yazılmış «paypal.com»: hakkında söylenecek bir şey yok.
- Latin «ypal»ın önünde bir Kiril er ve a olan aynı kelime: bir kelime, iki yazı sistemi, işaretlenmiş.
- Tümüyle Kiril bir Rusça kelime: bir yazı sistemi, sıradan metin, işaretlenmemiş.
- Han, Hiragana ve Katakana’yı birlikte kullanan bir Japonca cümle: üç betik, bir yazı sistemi, işaretlenmemiş.
O son durum, kuralın özen gerektirmesinin nedenidir. Japonca aynı anda üç betikle yazılır ve Korece ikisini karıştırır; bu yüzden saf bir «birden çok betik şüphelidir» testi her Japonca cümleyi bir saldırı olarak adlandırırdı. Gerçekten tek bir yazı sistemi olan birleşimler tek olarak ele alınır; bu, uyarıyı anlamlı tutar.
Normalleştirme, ya da iki özdeş dize neden farklıdır
Bazı karakterler birden çok şekilde yazılabilir. é harfi ya tek kod noktası U+00E9’dur ya da U+0065 U+0301 çiftidir — düz bir e’nin ardından birleştirici bir keskin aksan. İkisi de aynı görünür. Hiçbiri yanlış değildir. Eşit değildirler.
Normalleştirme, bir yazımı seçme sürecidir ve onun dört biçimi vardır. NFC yapabildiği her yerde bileşir ve web’in varsayılan olarak varsaydığıdır; NFD ise ayrıştırır. İki K biçimi daha ileri gider ve uyumluluk karakterlerini de katlar — tam genişlikli A düz bir A olur ve fi ligatürü fi olur — ki bu arama ve eşleştirme için yararlı ve saklama için kayıplıdır.
Buradaki panel, yapıştırdığınız her şeyin dört biçimini de gösterir ve hangilerinin girdiden farklı olduğunu işaretler. Hiçbiri farklı değilse, metin zaten normalleştirilmiştir ve peşinde olduğunuz uyumsuzluk başka bir yerdedir. Bazıları farklıysa, onu buldunuz.
Adlar, kategoriler, betikler ve bloklar
Atanmış her karakter dört kimlik parçası taşır ve bunlar farklı soruları yanıtlar. Ad, karakterin kendisidir. Genel kategori, ne tür bir şey olduğunu söyler — bir küçük harf, bir birleştirici işaret, bir para birimi simgesi, bir biçim denetimi. Betik, ait olduğu yazı sistemidir. Blok, atandığı kod noktası aralığıdır; dilbilimsel değil, örgütsel bir gerçektir.
Blok ve betik karıştırılması kolaydır ve çoğu zaman uyuşmaz. Latin harfleri en az yarım düzine blokta yaşar ve bir blok birkaç betikten karakter tutabilir. «Bu hangi alfabe» bilmek istediğinizde, yanıt betiktir; «standartta bu nerede yaşar» bilmek istediğinizde, blok.
Adlar, betikler ve bloklar burada her dilde bilerek İngilizce gösterilir. Bunlar düzyazı değil, standart tarafından tanımlanan tanımlayıcılardır — U+200D, dünyanın her yerinde ZERO WIDTH JOINER olarak adlandırılır ve onu çevirmek aranmasını imkânsız kılardı.
Kodlamalar ve kaçışlar
Bir kod noktası bir sayıdır; ancak bir kodlama seçildikten sonra bayt olur. UTF-8 bir ile dört bayt arasında kullanır ve ASCII’yi değişmeden tutar; kazanmasının nedeni budur. UTF-16 bir ya da iki 16 bitlik birim kullanır ve JavaScript dizelerinin oluştuğu şeydir — .length’in tek bir emoji için 2 bildirmesinin nedeni budur.
U+0041 41 # UTF-8: one byte, same as ASCII U+00E9 C3 A9 # UTF-8: two bytes U+20AC E2 82 AC # UTF-8: three bytes U+1F600 F0 9F 98 80 # UTF-8: four bytes
Buradaki her satır ayrıca karakteri JavaScript, JSON, HTML, CSS, URL ve Python’da bir kaçış olarak yazılmış, kopyalamaya hazır verir. Bunların hepsi aynı değildir ve fark BMP’nin üstünde önemlidir: JavaScript ve Python’un bir kod noktası kaçışı vardır ve onu kullanır, JSON’un ise yoktur ve bir emojiyi iki vekil yarısı olarak yazmak zorundadır.
Gizli karakterler ve bir yapay zekâ modelinden çıkan metin
Buraya yapıştırılan metnin büyük bölümünü yapıştıran kişi yazmamıştır: bir belgeden, bir web sayfasından, bir talep kaydından ya da bir asistanın yanıtından kopyalanmıştır ve onunla gelen soru, göremediği karakterler taşıyıp taşımadığıdır. Bu araç tam olarak bunu yanıtlar ve yanıtın nereye kadar ulaştığını söylemekte yarar var: metin kod noktalarına ayrılır ve standardın ad verdiklerine adı yazılır, ikinci bir bakışı hak edenler ise listenin üstündeki bir satırda sayılır. O satır çıkmıyorsa hiçbir şey bulunmamıştır.
Gizli bir karakterin kanıtladığı şey, bu konuda yazılanların neredeyse tamamının ima ettiğinden dardır. Bir kod noktasının içinde nereden geldiği kayıtlı değildir: bir içerik yönetim sisteminden kopyalanarak girmiş olanla üretilmiş bir yanıtla birlikte girmiş olan aynı değerdir. Büyük dil modellerinin çıktısında görünmez karakterler gerçekten de bildirildi ve en çok ilgi çeken durumda — sıradan bir boşluğun yakıştığı yerde beliren dar bölünmez boşluk — modelin üreticisi bunun bilerek konulmuş bir şey değil, eğitimin yan ürünü olduğunu yanıtladı ve bildirimler birkaç gün içinde kesildi. Yani buradaki bir bulgu neyi sileceğinizi söyler. Cümleyi neyin yazdığını söylemez.
- Sıradan boşluk olmayan boşluklar. Bölünmez boşluk (U+00A0) ile dar bölünmez boşluk (U+202F) en çok anılan ikilidir; her biri aşağı yukarı bir boşluk genişliğindedir, her biri başka bir karakterdir ve bu araç ikisini de işaretler.
- Hiç genişliği olmayan karakterler. Sıfır genişlikli boşluk (U+200B), kelime birleştirici (U+2060) ve bayt sırası işareti (U+FEFF) hiçbir şey çizmez, incelemeden sağ çıkar ve dokundukları ilk karşılaştırmayı bozar. Görünmez olarak işaretlenirler.
- Tags bloğu (U+E0000’dan U+E007F’ye). Yazdırılabilir her ASCII karakteri için görünmez bir kod noktası taşır — U+E0041’in adı TAG LATIN CAPITAL LETTER A’dır — öyle ki hiçbir şey göstermeyen bir metnin içine bütün bir cümle harf harf yazılabilir. Burada her biri adlandırılır ve görünmez olarak işaretlenir.
- Suçlanan ve gizli olmayan noktalama. Uzun tire (U+2014) ile kıvrık kesme işareti (U+2019) görünür bir iz çizer, bu yüzden burada hiçbir şey onları işaretlemez; onları ne üretmiş olursa olsun sıradan dizgidir.
Denetimi yapmanın iki gerekçesini ayrı tutmakta yarar var. Gündelik olanı, görünmez karakterlerin sessizce bir şeyleri bozmasıdır: eşleşmesi gereken bir karşılaştırma, bir arama anahtarı, girdinizi nedenini söylemeden geri çeviren bir alan. Öteki, metnin insanlar kadar programlarca da okunmasıdır: Tags bloğundaki karakterler dil etiketleri için düşünülmüştü, çoğu düzenleyicide ve farkta hiçbir şey çizmezler, ama metne bakmak yerine onu okuyan bir şey onları yine de okur. Uzun bir yanıtı bütün olarak yapıştırıyorsanız şunu unutmayın: satır listesi kırpılır, sayım kırpılmaz — sayım yapıştırdığınız her şeyin üzerinden alınır.
Sıkça sorulan sorular
- Dizem neden görebildiğim karakter sayısından uzun?
- Ya görünmez karakterler içerir ya da birkaç kod noktasından kurulmuş grafemler içerir. İkisi de burada gösterilir: görünmez karakterler işaretlenir ve çok-kod-noktalı grafemler gruplanır; böylece tek karakteri ve onu oluşturan birkaç değeri görebilirsiniz.
- İki dize özdeş görünüyor ama eşit değil. Neden?
- Genellikle normalleştirme. Aksanlı bir harf tek bir kod noktası ya da bir harf artı birleştirici bir işaret olabilir ve ikisi de aynı işlenir. Her dizeyi buraya yapıştırın ve kod noktası listelerini karşılaştırın ya da hangi normalleştirme biçimlerinin girdiden farklı olduğuna bakın.
- Sıfır genişlikli boşluk nedir ve metnime nasıl girdi?
- Genişliği ve izi olmayan bir karakterdir; bir satır-sonu fırsatı önermek için kullanılır. Genellikle bir web sayfasından, bir belge düzenleyicisinden ya da bir sohbet istemcisinden metin kopyalayarak gelir ve hiçbir şey görünmediği için, bir şey dizeleri karşılaştırıp başarısız olana dek her incelemeden sağ çıkar.
- Bir kod noktası ile bir karakter arasındaki fark nedir?
- Bir kod noktası tek bir Unicode değeridir. Günlük anlamda bir karakter bir grafemdir — bir okurun tek olarak saydığı — ve bir grafem birkaç kod noktası olabilir. Bir aile emojisi beş kod noktası ve bir grafemdir.
- Araç neden bazı karakterlerin adı olmadığını söylüyor?
- Dört farklı neden ve hangisi olduğunu söyler. Vekiller ve özel kullanım kod noktalarının standartta adı yoktur, atanmamış olanların adlandıracak bir şeyi yoktur ve nadiren incelenen tarihi bir bloktaki bir karakterin, bu yapının taşımadığı bir adı vardır — ad tablosu, hepsini göndermek yerine insanların gerçekte yapıştırdığı blokları tutar.
- Karışık betik uyarısı bir saldırının kanıtı mı?
- Hayır. Tek bir kelimenin harflerini birden çok yazı sisteminden çektiği anlamına gelir; bu, sahte bir adın aldığı biçimdir ve ayrıca sıradan metnin arada bir yaptığı bir şeydir. Bakmak için bir neden, bir hüküm değil.
- Yapıştırdığım herhangi bir şey bir sunucuya gönderiliyor mu?
- Hayır. Karakter veritabanı sayfayla indirilir ve her şey tarayıcınızda çalışır; yazdığınız hiçbir şey yüklenmez ya da günlüğe yazılmaz ve ağ bağlantısı olmadan çalışır.
- Bir yapay zekâ modelinin metni görünmez karakterler içerir mi?
- Bazen, ve hiçbir zaman bir şeyi kimliklendirecek biçimde değil. En çok ilgi çeken durum, uzun yanıtlarda sıradan bir boşluğun yakıştığı yerde beliren dar bölünmez boşluktu (U+202F); modelin üreticisi bunun bilerek konulmuş bir şey değil, eğitimin yan ürünü olduğunu yanıtladı ve birkaç gün içinde görülmez oldu. Metninizi buraya yapıştırın, içinde ne olduğunu göreceksiniz. Göremeyeceğiniz şey nereden geldiğidir, çünkü bir kod noktası bunu kaydetmez.
- Metnimdeki gizli karakterleri nasıl bulur ve silerim?
- Bulmak için buraya yapıştırın: her kod noktası bir satır alır, adı varsa adıyla, ikinci bir bakışı hak edenler listenin üstünde sayılır. Silmek düzenleyicinizin işidir — burada hiçbir şey metninizi yeniden yazmaz — ama hangi kod noktasının peşinde olduğunuzu bir kez öğrendiğinizde, her satır onu altı biçimde kaçış olarak verir; kaçışlardan anlayan bir arama kutusunun istediği de budur.
- Uzun tire ya da kıvrık tırnak gizli bir karakter midir?
- Hayır. Uzun tire (U+2014) de kıvrık kesme işareti (U+2019) de ekranda bir iz çizer, bu yüzden burada hiçbir şey onları işaretlemez. Üretilmiş yazının belirtisi olarak sık sık öne sürülürler; bu bir biçem sorusudur ve bir karakter inceleyicisinin yanıtlayabileceği bir şey değildir. Yine de başka bir nedenle bilmekte yarar var: ikisi de ASCII değildir, dolayısıyla ASCII bekleyen bir şeyi rahatsız edebilirler ve bunlarla yazılmış bir dize, kısa çizgi ve düz kesme işaretiyle yazılmış aynı dizeye eşit çıkmaz.
İlgili araçlar
- URL slug üreteci
Herhangi bir başlığı temiz bir URL slug’ına çevirin.
- Harf durumu dönüştürücü
camelCase, snake_case, Title Case ve diğerleri arasında dönüştürün.
- LLM token sayacı
Metninizin kaç token tuttuğunu tarayıcınızda tam olarak sayın.
- Metin uzunluğu
Karakterleri, kelimeleri ve satırları sayın — Unicode duyarlı.