Tidak kira jika anda seorang pembangun perisian, penulis salinan atau anda hanya menulis e-mel, teks mempunyai banyak perangkap yang perlu anda ketahui. Sesetengah mungkin menyebabkan banyak isu, daripada pepijat dalam apl anda melalui artifak visual sehinggalah kepada mangsa! Mari kita lihat bagaimana kita boleh mengelakkannya.
Teks (aka rentetan) wujud dalam hampir semua projek perisian, daripada satu baris seperti hello-worlds kepada sistem perusahaan yang mengandungi berbilion baris kod, tanpa mengira bahasa pengaturcaraan, platform dan sebagainya. Teks hanyalah urutan aksara, jadi ini bukan sains roket, bukan? Mari lihat apakah perangkap yang boleh anda hadapi!
Sesetengah abjad dunia (termasuk bahasa Inggeris) adalah dwikameral, yang bermaksud ia mengandungi kedua-dua huruf besar dan kecil.
Contohnya: a ialah huruf kecil dan A ialah huruf besar. Penukaran dari satu huruf ke huruf lain adalah operasi yang agak biasa.
Selongsong mungkin kelihatan remeh — satu aksara baru sahaja ditukar (dipetakan) kepada aksara lain. Ia juga boleh menjadi watak kepada dirinya sendiri jika ia bukan huruf, seperti 1 atau + dan seterusnya. Selain itu, pemetaan ini sentiasa boleh diterbalikkan, mis. A->a dan a->A. Jadi, semuanya kelihatan baik pada pandangan pertama. Nah, tiada apa yang boleh jauh dari kebenaran!
Ini bukan jenaka dan kami tidak bercakap tentang Nazi tatabahasa yang marah. Seperti yang anda boleh baca dalam artikel ini, gangguan sarung menyebabkan 2 mangsa dan menempatkan 3 orang lagi dalam penjara.
Bagaimana ia berlaku? Nah, dalam bahasa Turki (dan Azeri) kita mempunyai 2 huruf i yang berbeza: bertitik (tertutup) dan tanpa titik (terbuka). Dalam abjad Inggeris dan Latin lain, huruf kecil sentiasa bertitik manakala huruf besar - tanpa titik. Semuanya digambarkan dalam Jadual 1. dan demo dalam talian.
Jadual 1. Huruf i bertitik dan tidak bertitik.
Huruf kecil | Huruf besar | |
---|---|---|
Bahasa Inggeris | saya bertitik | Saya tiada titik |
Turki | saya bertitik | İ bertitik |
Turki | i tiada titik | Saya tiada titik |
Seperti yang anda lihat, hasil perubahan selongsong bergantung pada konteks, yang seterusnya bergantung pada bahasa semasa. Adalah penting untuk menggunakan bahasa yang sesuai semasa mengarang teks yang ditujukan untuk manusia. Jika anda tidak mengambil berat tentang perkara ini, kata-kata anda mungkin mempunyai makna yang berbeza daripada yang dimaksudkan.
Sebaliknya, teks yang boleh dibaca mesin seperti pengepala HTTP atau kekunci JSON harus diproses dengan cara yang neutral bahasa. Jika tidak, anda mungkin mendapat aksara bukan ASCII dalam output yang mungkin memecahkan logik aplikasi. Situasi tepat itu berlaku di GSON, perpustakaan yang digunakan oleh beribu-ribu (atau mungkin berjuta-juta) projek.
Watak dengan diakritik boleh diprakarang seperti ó, atau dicipta dengan menggabungkan tanda seperti ó. Apabila membaca halaman ini, kedua-duanya kelihatan seperti watak yang sama. Namun, jika melihat hexdump yang kedua atau cuba mendapatkan panjangnya secara pemrograman, seperti dalam demo ini, anda akan melihat bahawa ia terdiri daripada 2 aksara individu: huruf kecil Latin o dan gabungan aksen akut. Begitu juga, setiap blok suku kata Hangul (abjad Korea) boleh dipragubah atau ditulis sebagai gabungan huruf/aksara individu jamos yang berbeza.
Mengapa menggabungkan markah sangat penting? Nah, terdapat dua cara untuk menulis kebanyakan aksara dengan diakritik (contohnya dari abjad Poland, Hungary atau Czech). Ini menjadikan operasi seperti menyusun, mencari atau mengukur panjang teks bukan remeh. Biasanya, untuk mencapai pengalaman pengguna yang terbaik, teks perlu dinormalisasi (ditukar kepada salah satu bentuk biasa). Jika tidak, pengguna mungkin keliru apabila mereka melihat, contohnya, berbilang log masuk atau nama fail "berbeza" yang kelihatan sama. Satu contoh yang baik ialah cara Slack mengendalikan nama saluran. Ia dinormalisasi sebelum penciptaan saluran, jadi situasi di mana nama yang sama ditulis dengan cara berbeza tidak boleh wujud bersama.
Terdapat 2 tahap kesetaraan aksara.Persamaan kanonikberlaku apabila aksara diandaikan mempunyai makna dan rupa yang sama, mis. ó dan ó yang disebutkan di atas hanya berbeza dengan cara penulisan (teknikal). Sebaliknya,keserasianbermakna watak mungkin kelihatan berbeza tetapi mungkin mempunyai makna yang sama. Contohnya ligatur ffi serasi dengan tiga huruf ffi yang berbeza tetapi ia tidak sama secara kanonik. Maklumat lanjut tentang penormalan Unicode boleh didapati dalam dokumentasi standard.
Walaupun kedua-dua bentuk tersusun dan terurai untuk setiap 2 tahap adalah diseragamkan — jadi kami mempunyai 4 bentuk normal secara keseluruhan — penormalan tidak selalu boleh diterbalikkan. Sebagai contoh, tanda angstrom Å diuraikan kepada huruf besar Latin A A ditambah cincin gabungan di atas ̊, yang digubah kembali kepada huruf besar Latin A dengan cincin di atas Å, bukan kepada tanda angstrom dari mana ia berasal.
Adalah juga penting bahawa semua aplikasi yang berkongsi teks tertentu menggunakan kaedah normalisasi yang sama. Jika tidak, ia boleh menyebabkan ralat halus dan/atau kehilangan data senyap. Pepijat sedemikian mungkin sukar ditemui kerana setiap aplikasi berfungsi dengan sempurna, sekurang-kurangnya apabila dijalankan secara individu. Aplikasi selalunya tidak "ranap" dalam kes sedemikian tetapi hanya menghantar atau menerima data yang berbeza daripada yang sepatutnya, menyebabkan akibat yang tidak diingini. Salah satu contohnya ialah pepijat ini dalam nettalk.
Litutur tipografi yang disebutkan di atas digunakan untuk menambah baik penampilan visual aksara tertentu yang tidak kelihatan baik secara berasingan bersebelahan antara satu sama lain. Kebanyakan pengguna tidak perlu risau tentang ligatur, kerana ia dijana secara automatik daripada huruf individu oleh perisian cth. TeX menghasilkan ligatur secara lalai. Walau bagaimanapun, pembangun alat sedemikian perlu mengambil kira bahawa, dalam beberapa kes, pengikat mungkin tidak sesuai dan menimbulkan ralat.
Lihat ini: fi. Adakah huruf kedua bertitik atau tidak bertitik? Pembaca berbahasa Turki mungkin keliru. Ligatur yang mengandungi i tidak boleh digunakan dalam beberapa konteks.
Beberapa skrip (kononnya bicameral) seperti Latin dan Greek mengandungi huruf dua kes. Hampir semua huruf mempunyai huruf kecil dan besar. Secara maya… tetapi bukan semua!
Walaupun set huruf kecil sentiasa ada, ia tidak benar untuk huruf besar. Jadi, jika terdapat aksara yang hanya mempunyai huruf kecil, apakah yang berlaku jika anda cuba menukarnya kepada huruf besar? Adakah ralat yang menyebabkan operasi gagal? Adakah watak itu akan kekal sama? Jawapannya bukan macam tu!
Salah satu contoh yang paling ketara ialah bahasa Jerman sharp s — ß. Ia ialah aksara huruf kecil dan, apabila ditukar kepada huruf besar, ia menjadi dua S - SS. Transformasi itu tidak boleh diterbalikkan - SS menjadi ss. Lihat dalam talian. TL;DR Unicode 5.1 memperkenalkan ẞ (HURUF BESAR LATIN SHARP S) tetapi ia tidak dianggap sebagai huruf besar ß dari segi pemetaan aksara. Ia baru-baru ini (pada 2016) ditambahkan pada set peraturan ortografi Jerman sebagai bentuk SS yang sama sah.
Banyak ligatur huruf kecil lain tidak mempunyai bentuk huruf besar yang telah ditetapkan sebelumnya. Senarai lengkap boleh didapati dalam dokumentasi Unicode Special Casing.
Sesetengah aksara besar tiada, jadi apa? Ligatur boleh terdiri daripada 2 atau 3 aksara, jadi teks huruf besar mungkin 3 kali lebih panjang daripada huruf kecil asal. Fakta ini amat penting apabila panjang teks yang terhasil adalah terhad. Contohnya, dalam avatar atau penjana parap, seperti dalam pepijat ini pada bitrise.io.
Abjad Yunani mengandungi huruf Sigma yang kelihatan seperti ini dalam huruf besar: Σ. Apakah bentuk huruf kecilnya? Nah, itu bergantung! Biasanya, ia adalah σ (bukan akhir) tetapi, pada akhir perkataan, ia adalah ς (akhir). Walau bagaimanapun, jika Sigma adalah satu-satunya huruf atau perkataan itu ditulis dalam huruf besar semua maka versi bukan akhir sentiasa digunakan, walaupun pada kedudukan akhir. Lihat contoh interaktif.
Apakah huruf kecil huruf besar Latin i dengan tilde Ĩ? Seperti yang anda duga, jawapannya tidak begitu remeh. Bentuk huruf kecil yang sepadan wujud. Kedua-dua bentuk tidak bertitik tetapi ia adalah perkara biasa. Kedua-dua i dan j tidak mempunyai titik jika mereka mempunyai beberapa diakritik yang dilampirkan. Jadi apa masalah di sini?
Selain bahasa Turki, peraturan ortografik Lithuania juga luar biasa dalam kes huruf I. Dalam yang terakhir, titik itu dikekalkan di bawah aksen. Ini bermakna, sebagai contoh, Ĩ yang disebutkan di atas, apabila huruf kecil dalam konteks bahasa Lithuania, menjadi i̇̃. Jika anda melihat dengan teliti, anda dapat melihat bahawa terdapat 3 aksara: huruf kecil Latin i, titik gabungan di atas dan tilde gabungan di atas. Panjang teks telah meningkat 3 kali ganda (sekali lagi).
Bagaimana anda boleh menulis perkataan yang terdiri daripada 7 huruf, menggunakan hanya 6 aksara? Hanya gunakan ligatur dan multigraf yang telah ditetapkan (digraf, trigraf dan sebagainya)! Sudah tentu tidak ada aksara yang telah dirangka untuk setiap gabungan huruf yang mungkin digabungkan. Walau bagaimanapun, yang sedia ada boleh digunakan untuk meningkatkan had panjang teks dengan berkesan. Contohnya, perkataan Silesiadzbonek(periuk) terdiri daripada 7 huruf tetapi boleh ditulis sebagaidzbonekmenggunakan 6 aksara sahaja. Lihat dalam talian. Ambil perhatian bahawa dz ialah digraf, bukan ligatur.
Kini anda boleh, sebagai contoh, mesej tweet yang mengandungi lebih daripada 140 aksara! Senarai digraf dan ligatur Unicode yang telah dirangka boleh didapati di sini.
Susunan abjad biasanya diajar pada awal sekolah rendah. A, B, C, D… dan seterusnya ke Z. Semudah pai!
Malangnya, susunan abjad bergantung pada bahasa. Malah kedudukan huruf Latin asas (tanpa diakritik) mungkin berbeza. Contohnya, dalam bahasa Estonia, huruf Z berada di antara S dan T.
Lokasi huruf dengan tanda diakritik juga tidak universal. Terdapat beberapa skim yang mungkin:
Sebelum huruf asas yang sepadan, seperti dalam bahasa Malta: W, X, Ż, Z.
Selepas huruf asas yang sepadan, seperti dalam bahasa Poland: A, Ą, B, C, Ć.
Di penghujung abjad, seperti dalam bahasa Sweden: Z, Å, Ä.
Pada kedudukan yang sama (untuk tujuan pengumpulan) seperti huruf asas, seperti dalam bahasa Hungary: O=Ó.
Perhatikan bahawa huruf yang sama mungkin disusun secara berbeza dalam pelbagai bahasa dan mungkin juga berbeza dalam bahasa yang sama, bergantung pada konteks!. Contohnya, dalam bahasa Slovak, A dengan umlaut sentiasa terletak selepas A. Walau bagaimanapun, dalam bahasa Jerman, ia mungkin sama ada mempunyai nilai yang sama dengan versi bukan umlaut, terletak selepasnya atau bahkan dianggap sebagai A+E. Maklumat lanjut tentang cara yang digunakan dalam kes yang boleh didapati di sini.
Bukan hanya surat individu yang tertakluk kepada pengumpulan. Multigraf juga boleh mempunyai peraturannya sendiri. Dalam bahasa Slovak, CH disusun antara H dan I. Jadi, sebagai contoh, perkataanchlieb(sebuah roti) akan dikumpulkan selepashodina(sejam). Sebaliknya, dalam bahasa Poland digraf itu dianggap sama seperti dua huruf berasingan - C dan H - dan oleh itu tidak mempunyai peraturan pengumpulan khas. Lihat dalam talian.
Hungarian even has double digraphs and each of them have their own collation rules. This leads to many complicated cases. Let’s consider one possible example. We have the SZ digraph. It is collated after S. Its doubled version (SZ + SZ) is a SSZ. This means that the wordkaszinó(a casino) should be beforekassza(cash register). Normally Z is after S but here we have: K A SZ I in the first word and (an equivalent of) K A SZ SZ in the second.
Furthermore, the same group of letters may or may not be a (double) digraph depending on the context. For example, aforementioned Slovak CH is treated as 2 separate letters C and H in some words e.g.viachlas(a polyphony). Normally, in Hungarian, NNY = NY + NY, like in the wordmennybolt(a heaven). However, we also have atizennyolc(eighteen) where NNY = N + NY, so there is a single letter N and a single digraph NY.
You may think that the headline above consist of only plain Latin letters. In fact, the vast majority of them are Greek, Cyrillic or Armenian capital letters. They are only the homoglyphs of some Latin letters.
So A (Latin capital A) is not the same thing as Α (Greek capital Alpha) nor А (Cyrillic capital A). Why is this important? Due to the fact that they are indistinguishable, they can be used in IDN homograph attacks. For example, the domain bank.com, only containing Latin letters, looks pretty much the same as bаnk.com, containing the Cyrillic small A instead of Latin small A. Such domains may be used for phishing.
Dealing with text may be tricky in some cases — especially if you work in a multilingual environment. As a rule of thumb, all configurations should be appropriate for the given context. For example, the user’s current language should be taken into account when processing texts visible to these users, while machine-readable ones should be processed in the language-neutral way (or using English if it is not possible). Selected collation settings should match actual usage as well. Text should be normalized when needed and the chosen normalization method should be consistent across all the system.
Want to know about more edge cases? Stay tuned, part 2 is on the way!
Atas ialah kandungan terperinci Kes Tepi yang Perlu Diingati. Teks Bahagian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!