JavaScript tüm kullanılan Unicode karakterlerini yazdır


JavaScript'in tüm Unicode karakterlerini yazdırmasını sağlamaya çalışıyorum. Araştırmalarıma göre, 1.114.112 Unicode karakteri var.

Aşağıdaki gibi bir betik işe yarayabilir:

for(i = 0; i < 1114112; i++) 
    console.log(String.fromCharCode(i));

Ama 1.114.112 Unicode karakterinin yalnızca %10'unun kullanıldığını öğrendim.

Sadece kullanılan Unicode karakterlerini nasıl yazdırabilirim?

Cevap #1

Jukka'nın dediği gibi, JavaScript'in belirli bir Unicode kod noktasına henüz bir sembol atanıp atanmadığını bilmenin yerleşik bir yolu yoktur.

Yine de, yapmak istediğin şeyi yapmanın bir yolu var.

Unicode veritabanını çözümleyen ve Unicode'daki her kategori, özellik, yazı, blok vb. için ayrı veri dosyaları oluşturan birkaç betik yazdım. Ayrıca, belirli bir Unicode kategorisindeki tüm kod noktalarını (yani bir sayı dizisi), belirli bir Unicode özelliğine sahip tüm sembolleri (yani her karakter için bir dizi string) veya belirli bir Unicode yazısındaki herhangi bir sembolle eşleşen bir düzenli ifadeyi programlı olarak almanıza olanak tanıyan bir HTTP API de oluşturdum.

Örneğin, Unicode v6.3.0'ta bir sembol atanmış her bir Unicode kod noktası için bir öğe içeren bir dizi string elde etmek için aşağıdaki URL'yi kullanabilirsiniz:

http://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=symbols&prepend=window.symbols%20%3D%20&append=%3B

Çıktıya istediğiniz her şeyi URL parametrelerini değiştirerek ekleyip başına ve sonuna ekleyebileceğinizi unutmayın, böylece verileri kendi betiklerinizde yeniden kullanmak daha kolay olur. Talep ettiğiniz gibi tüm bu sembolleri console.log() ile yazdıran örnek bir HTML sayfası şu şekilde yazılabilir:

<!DOCTYPE html>
<meta charset="utf-8">
<title>All assigned Unicode v6.3.0 symbols</title>
<script src="http://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=symbols&prepend=window.symbols%20%3D%20&append=%3B"></script>
<script>
  window.symbols.forEach(function(symbol) {
    // Do what you want to do with `symbol` here, e.g.
    console.log(symbol);
  });
</script>

Demo. Bu çok fazla veri olduğundan, bu sayfayı açtığınızda Geliştirici Araçları konsolunuzun yavaşlayabileceğini unutmayın.

Güncelleme: Günümüzde bunun yerine unicode-11.0.0 gibi Unicode veri paketlerini kullanmalısınız. Node.js'te, ardından şu işlemleri yapabilirsiniz:

const symbols = require('unicode-11.0.0/Binary_Property/Assigned/symbols.js');
console.log(symbols);

// Or, to get the code points:
require('unicode-11.0.0/Binary_Property/Assigned/code-points.js');

// Or, to get a regular expression that only matches these characters:
require('unicode-11.0.0/Binary_Property/Assigned/regex.js');

Cevap #2

JavaScript'te bir kod noktasının bir karaktere atanıp atanmadığını doğrudan öğrenmenin bir yolu yoktur, bu da burada sorulan soru gibi görünüyor. Uygun kaynaklardan çıkarılmış bilgilere ihtiyacınız var ve yeni karakterler Unicode'un yeni sürümlerinde atandıkça bu bilginin güncellenmesi gerekir.

Unicode'de 1.114.112 kod noktası vardır. Unicode standardı, her kod noktasına gc, Genel Kategori özelliğini atar. Bu özelliğin değeri Cs, Co veya Cn dışında bir şeyse, kod noktası bir karaktere atanır. (gc değeri Co olan kod noktaları Özel Kullanım kod noktalarıdır; bu kod noktalarına hiçbir karakter atanmaz, ancak özel anlaşmalarla karakterler için kullanılabilirler.)

Yapmanız gereken, Unicode karakter veritabanındaki bazı ilgili dosyaların bir kopyasını almak (gerçekte belirli formatlarda dosya koleksiyonu) ve bunları okuyan ve atanmış kod noktaları hakkında bilgi üreten bir kod yazmaktır. Tüm Unicode karakterlerini yazdırma amacıyla, bu bilgiyi atanmış kod noktalarının aralıkları dizisi olarak üretmek en iyisi olabilir. Ve standart, yeni karakterlerle güncellendiğinde bu tekrar edilmesi gerekecektir.

Geri kalan bile önemsiz değildir. Bir karakteri yazdırmanın ne anlama geldiğine karar vermeniz gerekir. Bazı karakterler, yeni bir satır oluşturmak gibi bir etkisi olabilecek kontrol karakterleridir, ancak görünür bir işaretçikleri yoktur. Bazıları (boşluklar) boş işaretçilere sahiptir. Bazıları (birleştirici işaretler) önlerindeki karaktere eklenen işaretler olarak görüntülenmek için tasarlanmıştır, ancak geleneksel olarak "bağımsız" karakterler olarak da gösterimler vardır. Bazıları, en yakın bağlama bağlı olarak esasen farklı şekiller alacak şekilde tasarlanmıştır; bunların izole formları da olabilir, ancak bir karakteri başka bir karakterin ardına yazmak, izole bir formun kullanılacağını garanti etmez.

Sonra yazı tipleri sorunu var. Hiçbir tek yazı tipi tüm Unicode karakterlerini içermiyor, bu yüzden birlikte kullanıldığında tüm Unicode'u kapsayan bir yazı tipleri koleksiyonu bulmanız gerekir, tercihen bunlar şekilde bir şekilde stil olarak birbirleriyle uyumlu olmalı.

Yani eğer sadece yazdırılabilir tüm Unicode karakterlerinin bir derlemesini arıyorsanız, Unicode kod tablolarını kullanmayı düşünebilirsiniz.