perangkat lunak suckless.org yang kurang menyebalkan

Berita16 Dilihat


libgrapheme adalah pustaka C99 berdiri bebas yang sangat sederhana yang menyediakan utilitas untuk menangani string dengan benar sesuai dengan standar Unicode 15.0.0 terbaru. Menawarkan sepenuhnya Unicode compliant

  • klaster grafem (yaitu karakter yang dirasakan pengguna) segmentasi
  • segmentasi kata
  • segmentasi kalimat
  • deteksi diperbolehkan peluang jeda baris
  • deteksi kasus (huruf kecil, besar, dan judul)
  • konversi kasus (untuk huruf kecil, huruf besar dan judul)

pada string UTF-8 dan array codepoint, yang keduanya juga dapat diakhiri dengan null.

Tabel pencarian yang diperlukan secara otomatis dihasilkan dari data standar Unicode (terdapat dalam tarball) dan sangat dikompresi. Lebih dari 10.000 pengujian kesesuaian yang dihasilkan secara otomatis dan lebih dari 150 pengujian unit memastikan kesesuaian dan kebenaran.

Tidak ada sistem build yang rumit yang terlibat dan semuanya dilakukan menggunakan satu Makefile yang sesuai dengan POSIX. Yang Anda butuhkan hanyalah kompiler C99, mengingat generator tabel pencarian dan kompresor yang hanya dijalankan pada waktu pembuatan juga ditulis dalam C99. Pustaka yang dihasilkan berdiri sendiri dan dengan demikian bahkan tidak bergantung pada pustaka standar untuk hadir saat runtime, menjadikannya pilihan yang cocok untuk aplikasi bare metal.

Ini juga jauh lebih kecil dan jauh lebih cepat daripada perpustakaan string Unicode lainnya (ICU, libunistring GNU, libutf8proc).

Perkembangan

Kamu bisa telusuri repositori kode sumber atau dapatkan salinannya dengan perintah berikut:

git clone https://git.suckless.org/libgrapheme

Unduh

libgrapheme mengikuti versi semantik skema.

Mulai

Mengonfigurasi dan menginstal libgrapheme secara otomatis melalui

./configure
make install

akan menginstal header grapheme.h dan pustaka statis libgrapheme.a dan pustaka dinamis libgrapheme.so (dengan symlink) di folder masing-masing. Uji kesesuaian dan unit dapat dijalankan dengan

make test

dan tolok ukur komparatif terhadap libutf8proc (yang merupakan satu-satunya perpustakaan Unicode yang cukup untuk dapat dibandingkan) dapat dijalankan dengan

make benchmark

Anda dapat mengakses manual di sini atau melalui libgrapheme(7) dengan mengetik

man libgrapheme

dan melihat halaman yang dirujuk, misalnya grapheme_next_character_break_utf8(3). Setiap halaman berisi contoh kode dan deskripsi ekstensif. Untuk memberikan satu contoh yang juga diberikan dalam manual, kode berikut memisahkan string yang diberikan ‘Tëst !’ ke dalam karakter yang dirasakan pengguna:

#include 
#include 
#include 

int
main(void)
{
	/* UTF-8 encoded input */
	char *s = "TxC3xABst xF0x9Fx91xA8xE2x80x8DxF0"
	          "x9Fx91xA9xE2x80x8DxF0x9Fx91xA6 xF0"
	          "x9Fx87xBAxF0x9Fx87xB8 xE0xA4xA8xE0"
	          "xA5x80 xE0xAExA8xE0xAExBF!";
	size_t ret, len, off;

	printf("Input: "%s"n", s);

	/* print each grapheme cluster with byte-length */
	printf("grapheme clusters in NUL-delimited input:n");
	for (off = 0; s[off] != ''; off += ret) {
		ret = grapheme_next_character_break_utf8(s + off, SIZE_MAX);
		printf("%2zu bytes | %.*sn", ret, (int)ret, s + off);
	}
	printf("n");

	/* do the same, but this time string is length-delimited */
	len = 17;
	printf("grapheme clusters in input delimited to %zu bytes:n", len);
	for (off = 0; off < len; off += ret) {
		ret = grapheme_next_character_break_utf8(s + off, len - off);
		printf("%2zu bytes | %.*sn", ret, (int)ret, s + off);
	}

	return 0;
}

Kode ini dapat dikompilasi dengan

cc (-static) -o example example.c -lgrapheme

dan outputnya adalah

Input: "Tëst 👨‍👩‍👦 🇺🇸 नी நி!"
grapheme clusters in NUL-delimited input:
 1 bytes | T
 2 bytes | ë
 1 bytes | s
 1 bytes | t
 1 bytes |  
18 bytes | 👨‍👩‍👦
 1 bytes |  
 8 bytes | 🇺🇸
 1 bytes |  
 6 bytes | नी
 1 bytes |  
 6 bytes | நி
 1 bytes | !

grapheme clusters in input delimited to 17 bytes:
 1 bytes | T
 2 bytes | ë
 1 bytes | s
 1 bytes | t
 1 bytes |  
11 bytes | 👨‍👩

Motivasi

Tujuan dari proyek ini adalah untuk menjadi alternatif yang tidak dapat dihisap dan dapat ditautkan secara statis ke solusi yang membengkak, rumit, dilingkupi, dan/atau salah untuk penanganan string Unicode (ICU, libunistring GNU, libutf8proc, dll.), memotivasi lebih banyak peretas untuk menangani Unicode dengan benar. string dalam proyek mereka dan memungkinkan ini bahkan dalam aplikasi yang disematkan.

Masalahnya dapat dengan mudah dilihat ketika melihat ukuran masing-masing perpustakaan: Perpustakaan ICU (libicudata.a, libicui18n.a, libicuio.a, libicutest.a, libicutu.a, libicuuc.a) berukuran sekitar 38MB dan libunistring ( libunistring.a) berukuran sekitar 2MB, yang tidak dapat diterima untuk penautan statis. Keduanya membutuhkan waktu beberapa menit untuk dikompilasi bahkan di komputer yang bagus dan membutuhkan banyak ketergantungan, termasuk Python untuk ICU. Di sisi lain libgrapheme (libgrapheme.a) hanya berbobot sekitar 300K dan dikompilasi (termasuk penguraian dan kompresi data Unicode) dalam waktu kurang dari satu detik, tidak memerlukan apa pun selain kompiler C99 dan pembuatan POSIX (1).

Beberapa perpustakaan, seperti libutf8proc dan libunistring, salah dengan mendasarkan API mereka pada asumsi yang tidak benar selama bertahun-tahun (misalnya menawarkan segmentasi klaster grafem stateless meskipun algoritme yang mendasarinya tidak stateless). Sebagai faktor tambahan, dekoder UTF-8 libutf8proc tidak aman, karena memungkinkan penyandian yang terlalu lama yang dapat dengan mudah digunakan untuk eksploitasi.

Sementara ICU dan libunistring menawarkan banyak fungsi dan bobot sebagian besar berasal dari data-lokal yang disediakan oleh standar Unicode, yang menerapkan implementasi-khusus (!) untuk beberapa hal, standar yang sama selalu mendefinisikan perilaku 'default' yang waras sebagai sebuah alternatif dalam kasus seperti itu memuaskan dalam 99% kasus dan yang dapat Anda andalkan.

Untuk beberapa bahasa, misalnya, perlu memiliki kamus untuk selalu menentukan secara akurat kapan sebuah kata dimulai dan diakhiri. Namun, default yang disediakan oleh standar sudah melakukan pekerjaan yang baik dengan menghormati batasan bahasa dalam kasus umum dan tidak terlalu membebani dalam hal kinerja.

Pengarang

  • Laslo Hunhold (dev@frign.de)

Silakan hubungi saya jika Anda memiliki informasi yang dapat ditambahkan ke halaman ini.


#perangkat #lunak #suckless.org #yang #kurang #menyebalkan

Source link

Komentar