Tidak kira sama ada 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 (alias 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 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 daripada satu huruf besar 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 selongsong menyebabkan 2 mangsa dan 3 orang lagi dipenjarakan.
Bagaimana perkara itu 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.
Lowercase | Uppercase | |
---|---|---|
English | i dotted | I dotless |
Turkish | i dotted | İ dotted |
Turkish | ı dotless | I dotless |
Seperti yang anda lihat, hasil perubahan selongsong bergantung pada konteks, yang selanjutnya 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, perkataan 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, sebuah perpustakaan yang digunakan oleh beribu-ribu (atau mungkin berjuta-juta) projek.
Watak dengan diakritik boleh dirangka 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 diprakarang 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 mengisih, 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, sebagai contoh, 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 yang berbeza tidak boleh wujud bersama.
Terdapat 2 tahap kesetaraan aksara. Persamaan kanonik berlaku apabila aksara diandaikan mempunyai makna dan rupa yang sama, mis. ó dan ó yang disebutkan di atas hanya berbeza dengan cara penulisan (teknikal). Sebaliknya, keserasian bermaksud aksara mungkin kelihatan berbeza tetapi mungkin mempunyai maksud yang sama. Contohnya ligatur ffi serasi dengan tiga huruf ffi yang berbeza tetapi ia tidak sama secara kanonik. Maklumat lanjut tentang penormalan Unikod 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 contoh sedemikian ialah pepijat ini dalam nettalk.
Litutur tipografi yang disebutkan di atas digunakan untuk memperbaik 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 sesetengah konteks.
Beberapa skrip (kononnya bicameral) seperti Latin dan Greek mengandungi huruf dua kes. Hampir semua huruf mempunyai huruf kecil dan besar. Hampir… 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 seperti itu!
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 penjana avatar atau 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, ia 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 masalahnya 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 boleh 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 Silesia dzbonek (periuk) terdiri daripada 7 huruf tetapi boleh ditulis sebagai dzbonek menggunakan 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 diprakarang 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 penyusunan) sebagai huruf asas, seperti dalam bahasa Hungary: O=Ó.
Perhatikan bahawa huruf yang sama mungkin disusun secara berbeza dalam pelbagai bahasa malah mungkin 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 sahaja surat individu yang tertakluk kepada pengumpulan. Multigraf juga boleh mempunyai peraturannya sendiri. Dalam bahasa Slovak, CH disusun antara H dan I. Jadi, sebagai contoh, perkataan chlieb (sebuah roti) akan dikumpulkan selepas hodina (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.
Hungary juga mempunyai digraf berganda dan setiap daripadanya mempunyai peraturan penyusunan sendiri. Ini membawa kepada banyak kes yang rumit. Mari kita pertimbangkan satu contoh yang mungkin. Kami mempunyai digraf SZ. Ia disusun selepas S. Versi dua kali gandanya (SZ + SZ) ialah SSZ. Ini bermakna perkataan kaszinó (kasino) hendaklah sebelum kassza (daftar tunai). Biasanya Z adalah selepas S tetapi di sini kita mempunyai: K A SZ I dalam perkataan pertama dan (setara dengan) K A SZ SZ dalam perkataan kedua.
Selain itu, kumpulan huruf yang sama mungkin atau mungkin bukan digraf (berganda) bergantung pada konteks. Sebagai contoh, CH Slovakia yang disebut di atas dianggap sebagai 2 huruf berasingan C dan H dalam beberapa perkataan cth. viachlas (polifoni). Biasanya, dalam bahasa Hungary, NNY = NY + NY, seperti dalam perkataan mennybolt (syurga). Walau bagaimanapun, kami juga mempunyai tizennyolc (lapan belas) dengan NNY = N + NY, jadi terdapat satu huruf N dan satu digraf NY.
Anda mungkin berpendapat bahawa tajuk di atas hanya terdiri daripada huruf Latin biasa. Malah, sebahagian besar daripada mereka adalah huruf besar Yunani, Cyrillic atau Armenia. Ia hanyalah homoglyph beberapa huruf Latin.
Jadi A (Ibukota Latin A) bukanlah perkara yang sama dengan Α (Ibukota Yunani Alpha) mahupun А (Ibukota Cyrillic A). Mengapa ini penting? Disebabkan oleh fakta bahawa mereka tidak dapat dibezakan, ia boleh digunakan dalam serangan homograf IDN. Sebagai contoh, domain bank.com, hanya mengandungi huruf Latin, kelihatan hampir sama dengan bаnk.com, mengandungi huruf Cyrillic small A dan bukannya Latin small A. Domain sedemikian boleh digunakan untuk pancingan data.
Berurusan dengan teks mungkin sukar dalam sesetengah kes — terutamanya jika anda bekerja dalam persekitaran berbilang bahasa. Sebagai peraturan, semua konfigurasi harus sesuai untuk konteks yang diberikan. Sebagai contoh, bahasa semasa pengguna harus diambil kira semasa memproses teks yang boleh dilihat oleh pengguna ini, manakala bahasa yang boleh dibaca mesin harus diproses dalam cara neutral bahasa (atau menggunakan bahasa Inggeris jika tidak boleh). Tetapan pengumpulan yang dipilih hendaklah sepadan dengan penggunaan sebenar juga. Teks harus dinormalisasi apabila diperlukan dan kaedah normalisasi yang dipilih harus konsisten merentas semua sistem.
Ingin mengetahui lebih banyak kes tepi? Nantikan, bahagian 2 sedang dalam perjalanan!
Atas ialah kandungan terperinci Kes Tepi yang Perlu Diingati. Teks Bahagian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!