Teks & alat harian · Kit Alat Teks
Watak yang tidak kelihatan: ruang tidak pecah, penyambung lebar sifar dan pemangkas
· Latar belakang
pembersihan teks unicode penerbitan
Tinjau aksara yang kelihatan seperti tiada — ruang tidak putus, ruang lebar sifar dan penyambung, tanda tertib bait — dari mana asalnya, yang dikira sebagai ruang kosong dan cara mencari dan mengalih keluarnya.
Dua baris yang sama yang bukan pendua — cara watak halimunan mengalahkan penyahduaan dan carian
Dua baris boleh kelihatan sama dalam editor namun gagal semakan kesamaan, carian atau nyahduplikasi. Satu mungkin mengandungi ruang U+0020 biasa manakala satu lagi mengandungi U+00A0, ruang tidak pecah. Aksara lebar sifar boleh mencipta masalah yang sama tanpa menduduki sebarang lebar yang boleh dilihat, meninggalkan penerbit dengan dua label yang nampaknya sepadan yang kekal sebagai rentetan yang berbeza.
Ini bukan semata-mata kosmetik. Titik kod tersembunyi boleh membahagikan dimensi analitik, mengalahkan operasi pencarian tepat, mengekalkan baris pendua atau membuat pengecam yang disalin gagal pengesahan. Sebelum menulis semula kandungan mengikut mata, simpan salinan sumber dan bandingkan rentetan yang mencurigakan secara sistematik. Paparan yang boleh dilihat ialah bukti tentang penampilan, bukan bukti bahawa urutan Unicode asasnya sepadan.
Dari mana asalnya — halaman web, pemproses perkataan, urutan emoji dan salin-tampal daripada PDF
Watak yang tidak kelihatan biasanya datang melalui kerja biasa. Halaman web menggunakan ruang yang tidak putus untuk mengekalkan istilah bersama-sama, pemproses perkataan mengekalkan jarak berorientasikan reka letak, dan pengekstrakan PDF membina semula teks daripada glif yang diposisikan. Menyalin antara sistem tersebut boleh membawa pemformatan aksara ke dalam medan CMS walaupun apabila destinasi sahaja memaparkan perkataan dan jurang yang biasa.
Tanda halimunan lain ialah bahagian sistem penulisan atau emoji yang disengajakan. Penyambung lebar sifar boleh menggabungkan komponen emoji menjadi satu simbol yang dipaparkan, manakala penyambung dan bukan penyambung mempengaruhi pembentukan dalam beberapa skrip. Asal itu penting: "tidak dapat melihatnya" tidak bermaksud "selamat untuk dipadamkan." Pembersihan harus menyasarkan artifak yang didiagnosis, bukan setiap aksara yang lebar pendahuluannya adalah sifar.
Keluarga ruang kosong — ruang biasa, tidak pecah, sempit dan ideografik, dan apa yang dianggap oleh trim JavaScript ruang kosong
Unicode mengandungi lebih daripada ruang harian. U+00A0 ialah ruang tidak pecah, U+202F ialah ruang tidak pecah yang sempit dan U+3000 ialah ruang ideografik. JavaScript pengendalian ruang kosong termasuk aksara ini, jadi `trim()`, `trimStart()` dan `trimEnd()` boleh mengalih keluarnya apabila ia berlaku di tepi rentetan yang berkaitan.
Pemangkasan baris Text Toolkit memanggil kaedah JavaScript pada setiap baris. Ia tidak menormalkan jarak dalaman, jadi ruang tidak putus antara dua perkataan kekal di sana. Statistik "aksara tanpa ruang"nya mengalih keluar aksara yang dipadankan dengan JavaScript `s`, yang lebih luas daripada ASCII ruang. Gunakan nombor itu sebagai ukuran yang ditentukan, bukan sebagai janji bahawa setiap titik kod yang tidak kelihatan telah dikecualikan.
Keluarga lebar sifar — ruang lebar sifar, penyambung dan bukan penyambung, penyambung perkataan dan tanda tertib bait, yang bukan ruang kosong sama sekali
Keluarga lebar sifar mengikut peraturan yang berbeza. Ruang lebar sifar U+200B, bukan penyambung lebar sifar U+200C, penyambung lebar sifar U+200D dan penyambung perkataan U+2060 ialah aksara format dan bukannya JavaScript ruang kosong. Oleh itu `trim()` biasa tidak mengeluarkannya. Baris yang mengandungi salah satu tanda ini bukan kosong semata-mata kerana skrin tidak menunjukkan dakwat.
U+FEFF mempunyai dua sejarah yang berkaitan: pada permulaan data yang dikodkan, ia boleh menandakan tanda pesanan bait, manakala dalam teks, ia berfungsi sebagai ruang tanpa patah lebar sifar. ECMAScript termasuk U+FEFF dalam set ruang kosong trimnya, tidak seperti U+200B hingga U+200D. Oleh itu, menganggap seluruh keluarga lebar sifar sebagai satu jenis ruang kosong akan bercanggah dengan tingkah laku JavaScript sebenar.
Mengesan mereka — menggunakan pembilang aksara untuk mengesan kiraan yang tidak sepadan dengan apa yang anda lihat, mengingati bahawa sesetengah penyambung melekat pada jiran dan kekal tersembunyi
Kiraan yang mengejutkan boleh memaklumkan anda tentang kandungan tersembunyi, tetapi ia tidak dapat mengenal pasti setiap kes. ToolAcre mengira kelompok grafem dengan `Intl.Segmenter` apabila tersedia. Penyambung yang mengambil bahagian dalam urutan emoji boleh membantu beberapa titik kod membentuk satu grafem, jadi menambah atau mengalih keluarnya boleh menukar pemaparan tanpa menghasilkan peningkatan satu aksara mudah yang akan ditunjukkan oleh pembilang titik kod.
Gunakan beberapa petunjuk bersama-sama: padanan tepat yang gagal, hasil "tanpa ruang" yang tidak dijangka, teks yang disalin diperiksa dalam editor sedar Unikod atau carian regex untuk titik kod tertentu. Kaunter sandaran menggunakan titik kod apabila Segmenter tidak tersedia, jadi keputusan juga boleh berbeza mengikut keupayaan pelayar. Mengira menyempitkan penyiasatan; ia bukan pengimbas aksara tersembunyi atau pemapar nama Unikod.
Mengesan aksara tersembunyi: kiraan memberikan petunjuk, bukan inventori yang lengkap
Untuk artifak salin dan tampal yang disahkan, lakukan pendua dan buka Cari dan ganti dalam mod regex. Mencari `[]` dan menggantikan dengan apa-apa membuang ruang lebar sifar dan aksara U+FEFF yang dibenamkan di seluruh teks. Alat ini menyusun corak dengan bendera global JavaScript, melaporkan kiraan penggantian dan membiarkan teks tidak berubah jika corak itu tidak sah.
Jangan luaskan corak itu secara automatik kepada `[-]`. Julat ini juga mengalih keluar U+200C dan U+200D, yang boleh menukar bentuk skrip dan memisahkan emoji yang dicantumkan kepada simbol yang berasingan. Tambahkan titik kod tersebut sahaja apabila pemeriksaan membuktikan ia tidak diingini. Selepas penggantian, jalankan penduaan dan bandingkan output dengan yang asal yang dipelihara sebelum diterbitkan.
Contoh yang berjaya: alih keluar sahaja aksara lebar sifar yang tidak diingini sebelum menyahgandakan
Pembersihan ini tidak menangani aksara kawalan dua arah, homoglyph atau setiap isu keselamatan yang dikaitkan dengan teks yang mengelirukan. Tanda arah boleh mengubah susunan visual, manakala serangan homoglyph menggunakan aksara kelihatan berbeza yang menyerupai satu sama lain. Tiada masalah diselesaikan dengan memadamkan ruang, dan regex watak halimunan yang sembarangan boleh merosakkan kandungan berbilang bahasa yang sah sambil kehilangan risiko sebenar.
Kit alat ini juga tidak mendedahkan bendera regex seperti Unicode atau mod berbilang talian, menyerlahkan setiap perlawanan akan datang atau melangkah melalui penggantian secara individu. Gantikan semua operasi merentas teks penuh, jadi kiraan yang dilaporkan dan tindakan Buat asal adalah perlindungan penting. Untuk kod sumber, salinan undang-undang atau skrip yang tidak dikenali, periksa setiap aksara dengan alat Unicode khusus sebelum membuat pengeditan pukal.
Bawa pulang - tidak kelihatan tidak bermakna tidak berbahaya; kaunter Text Toolkit dan cari-dan-ganti regex mendedahkan dan mengalih keluarnya tanpa meninggalkan pelayar anda
Tidak kelihatan tidak bermakna kosong, boleh ditukar ganti atau berbahaya. Ruang tidak pecah ialah ruang kosong dengan semantik reka letak; penyambung sifar lebar boleh membawa semantik membentuk; U+FEFF berkelakuan berbeza sekali lagi di bawah pemangkasan JavaScript. Pembersihan yang tepat bermula dengan menamakan titik kod, memahami sebab ia mungkin ada dan memutuskan sama ada destinasi masih memerlukan fungsinya.
Gunakan Text Toolkit sebagai meja kerja sebelah pelayar terkawal: kiraan boleh mendedahkan percanggahan, pencarian dan penggantian regex boleh mengalih keluar set yang ditakrifkan dengan tepat dan penyahduaan boleh mengesahkan bahawa perbezaan tersembunyi telah hilang. Kekalkan yang asli, elakkan pemadaman pencantum secara lalai, dan sahkan hasil yang diberikan. Pembetulan yang sempit dan boleh disemak adalah lebih selamat daripada menganggap semua Unicode yang tidak kelihatan sebagai serpihan.