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.

Girdi

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.

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.