encoding_rs Implementasi dari (bagian non-javascript dari) standar penyandian yang ditulis dalam karat.
Standar pengkodean mendefinisikan set pengkodean karakter yang kompatibel dengan web, yang berarti peti ini dapat digunakan untuk memecahkan kode konten web. encoding_rs digunakan di tokek dimulai dengan Firefox 56. Karena tumpang tindih yang terkenal antara pengkodean warisan di web dan pengkodean warisan yang digunakan pada jendela, peti ini mungkin digunakan untuk situasi yang tidak terkait dengan WEB juga; Lihat di bawah untuk tautan ke peti yang berdekatan.
Selain itu, modul mem menyediakan berbagai operasi untuk berurusan dengan teks in-ram (berbeda dengan data yang berasal dari atau pergi ke batas IO). Modul mem adalah modul, bukan peti terpisah karena efisiensi detail implementasi internal.
Karena case penggunaan tokek, encoding_rs mendukung decoding ke dan encoding dari UTF-16 selain mendukung kasus decoding penggunaan karat yang biasa ke dan pengkodean dari UTF-8. Selain itu, API telah dirancang agar ramah FFI untuk mengakomodasi sisi C ++ Gecko.
Secara khusus, encoding_rs melakukan hal berikut:
u16 / char16_t ).u16 / char16_t ) menjadi urutan byte dalam pengkodean karakter yang ditentukan standar seolah-olah pengganti tunggal telah diganti dengan karakter pengganti sebelum melakukan enkode. (UTF-16 Gecko berpotensi tidak valid.)document.characterSet . Selain itu, encoding_rs::mem melakukan hal berikut:
std::io Khususnya, daftar fitur di atas tidak termasuk kemampuan untuk membungkus std::io::Read , decode ke UTF-8 dan menyajikan hasilnya melalui std::io::Read . Peti encoding_rs_io menyediakan kemampuan itu.
no_std Peti bekerja di lingkungan no_std . Secara default, fitur alloc , yang mengasumsikan bahwa alokasi diaktifkan. Untuk lingkungan no-allocator, fitur default (yaitu alloc ) dapat dimatikan. Ini membuat bagian dari API yang mengembalikan Vec / String / Cow tidak tersedia.
Untuk pengkodean karakter decoding yang terjadi dalam email, gunakan charset Crate alih -alih menggunakan yang ini secara langsung. (Itu membungkus peti ini dan menambahkan decoding UTF-7.)
Untuk pemetaan ke dan dari pengidentifikasi halaman kode Windows, gunakan peti codepage .
Peti ini tidak mendukung penyandian DOS byte tunggal yang tidak diperlukan oleh platform web, tetapi peti oem_cp melakukannya.
Normalisasi teks ke dalam bentuk normalisasi unicode C sebelum mengkodekan teks ke dalam pengkodean warisan meminimalkan karakter yang tidak dapat diabaikan. Teks dapat dinormalisasi ke bentuk normalisasi unicode C menggunakan peti icu_normalizer .
Pengecualiannya adalah Windows-1258, yang setelah menormalkan ke unicode normalisasi bentuk C membutuhkan tanda nada untuk didekomposisi untuk meminimalkan karakter yang tidak dapat dipetakan. Tanda nada Vietnam dapat terurai menggunakan peti detone .
TL; DR: (Apache-2.0 OR MIT) AND BSD-3-Clause untuk kombinasi kode dan data.
Silakan lihat file bernama Hak Cipta.
Kode non-tes yang tidak dihasilkan dari data WhatWG di peti ini berada di bawah Apache-2.0 atau MIT. Kode uji berada di bawah CC0.
Peti ini berisi kode/data yang dihasilkan dari data yang disediakan. Hulu WhatWG mengubah lisensi untuk bagian spesifikasi yang dimasukkan ke dalam kode sumber dari CC0 menjadi BSD-3-Clause antara rilis awal peti ini dan versi peti ini saat ini. Legenda lisensi dalam sumber telah diperbarui untuk bagian-bagian kode yang dihasilkan yang telah berubah sejak perubahan lisensi hulu.
Dokumentasi API yang dihasilkan tersedia secara online.
Ada tulisan panjang tentang desain dan internal peti.
Lapisan FFI untuk encoding_rs tersedia sebagai peti terpisah. Peti dilengkapi dengan pembungkus Demo C ++ menggunakan tipe Perpustakaan C ++ Standar dan GSL.
Binding untuk modul mem ada di krat encoding_c_mem.
Untuk konteks tokek, ada pembungkus C ++ menggunakan tipe MFBT/XPCOM.
Ada tulisan tentang pembungkus C ++.
Saat ini ada fitur kargo opsional ini:
simd-accel Mengaktifkan akselerasi SIMD menggunakan fitur pustaka standar portable_simd yang bergantung pada malam hari.
Ini adalah fitur opt-in, karena memungkinkan fitur ini memilih keluar dari jaminan Rust untuk kompiler di masa depan yang menyusun kode lama (alias. "Stability Story").
Saat ini, ini belum diuji sebagai peningkatan kecuali untuk target ini dan memungkinkan fitur simd-accel diharapkan untuk memecah build pada target lain:
Jika Anda menggunakan karat malam, Anda menggunakan target yang komponen pertamanya adalah salah satu dari yang di atas, dan Anda siap untuk merevisi konfigurasi saat memperbarui karat , Anda harus mengaktifkan fitur ini. Kalau tidak, tolong jangan aktifkan fitur ini.
Digunakan oleh Firefox.
serde Mengaktifkan dukungan untuk serial dan deserialization &'static Encoding -typed struct bidang menggunakan Serde.
Tidak digunakan oleh Firefox.
fast-legacy-encodeOpsi Catch-All untuk mengaktifkan opsi ENCODE Legacy tercepat. Tidak mempengaruhi kecepatan decode atau kecepatan encode UTF-8.
Saat ini, opsi ini setara dengan mengaktifkan opsi berikut:
fast-hangul-encodefast-hanja-encodefast-kanji-encodefast-gb-hanzi-encodefast-big5-hanzi-encodeMenambahkan 176 kb ke ukuran biner.
Tidak digunakan oleh Firefox.
fast-hangul-encodePerubahan yang mengkode suku kata hangul yang telah dikomposisi ke dalam EUC-KR dari pencarian biner atas tabel yang dioptimalkan decode untuk dicari dengan indeks membuat teks-teks Korea mengkode sekitar 4 kali lebih cepat dari tanpa opsi ini.
Menambahkan 20 kb ke ukuran biner.
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
fast-hanja-encodePerubahan Pengkodean Hanja menjadi EUC-KR dari pencarian linier di atas tabel yang dioptimalkan untuk dicari oleh indeks. Karena Hanja praktis tidak ada dalam teks Korea modern, opsi ini tidak memengaruhi perfomansi dalam kasus umum dan terutama masuk akal jika Anda ingin membuat penolakan aplikasi Anda yang tangguh oleh seseorang dengan sengaja memberi makan banyak hanja untuk mengkodekan ke dalam EUC-kr.
Menambahkan 40 kb ke ukuran biner.
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
fast-kanji-encode Perubahan pengkodean kanji menjadi shift_jis, euc-jp dan iso-2022-jp dari pencarian linier melalui tabel yang dioptimalkan decode untuk mencari dengan indeks membuat encode teks polos Jepang ke pengkodean warisan 30 hingga 50 kali lebih cepat daripada tanpa opsi ini (sekitar 2 kali lebih cepat daripada dengan less-slow-kanji-encode ).
Lebih diutamakan daripada less-slow-kanji-encode .
Menambahkan 36 kb ke ukuran biner (24 kb dibandingkan dengan less-slow-kanji-encode ).
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
less-slow-kanji-encodeMembuat JIS X 0208 Level 1 Kanji (Kanji yang paling umum di Shift_Jis, EUC-JP dan ISO-2022-JP) mengkodekan lebih lambat (pencarian biner daripada pencarian linier) membuat encode teks polos Jepang ke pengkodean warisan 14 hingga 23 kali lebih cepat daripada tanpa opsi ini.
Menambahkan 12 kb ke ukuran biner.
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
fast-gb-hanzi-encode Perubahan Pengkodean Hanzi di CJK Unified Ideographs Blocks menjadi GBK dan GB18030 dari pencarian linier pada bagian tabel yang dioptimalkan oleh decode diikuti oleh pencarian biner atas bagian lain dari tabel yang dioptimalkan untuk 110 kali yang disederhanakan tanpa kode yang disederhanakan tanpa kode-waktu yang disederhanakan dengan tabel yang disederhanakan dengan tabel yang disederhanakan dengan tabel yang disederhanakan dengan pembesaran warisan 100 hingga 110 kali untuk 110 kali lipat dari waktu ke 110 untuk 110 kali tanpa kode yang disederhanakan dengan tabel tanpa kode yang disederhanakan. less-slow-gb-hanzi-encode ).
Lebih diutamakan daripada less-slow-gb-hanzi-encode .
Menambahkan 36 kb ke ukuran biner (24 kb dibandingkan dengan less-slow-gb-hanzi-encode ).
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
less-slow-gb-hanzi-encodeMembuat GB2312 Level 1 Hanzi (Hanzi yang paling umum di GB18030 dan GBK) mengkodekan lebih lambat (pencarian biner daripada pencarian linier) membuat encode teks polos Cina yang disederhanakan ke pengkodean warisan sekitar 40 kali lebih cepat daripada tanpa opsi ini.
Menambahkan 12 kb ke ukuran biner.
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
fast-big5-hanzi-encode Perubahan Pengkodean Hanzi di CJK Unified Ideographs Blocks menjadi BIG5 dari pencarian linier pada bagian Tabel yang dioptimalkan decode untuk mencari dengan indeks membuat encode teks polos Cina tradisional ke BIG5 105 hingga 125 kali lebih cepat dari tanpa opsi ini (sekitar 3 kali lebih cepat daripada dengan less-slow-big5-hanzi-encode ).
Lebih diutamakan daripada less-slow-big5-hanzi-encode .
Menambahkan 40 kb ke ukuran biner (20 kb dibandingkan dengan less-slow-big5-hanzi-encode ).
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
less-slow-big5-hanzi-encodeMembuat Big5 Level 1 Hanzi (Hanzi yang paling umum di BIG5) mengkode lebih sedikit (pencarian biner daripada pencarian linier) membuat encode teks polos tradisional Cina ke BIG5 sekitar 36 kali lebih cepat dari tanpa opsi ini.
Menambahkan 20 kb ke ukuran biner.
Tidak mempengaruhi kecepatan decode.
Tidak digunakan oleh Firefox.
Untuk decoding ke UTF-16, tujuannya adalah untuk melakukan setidaknya serta UCONV lama Gecko. Untuk decoding ke UTF-8, tujuannya adalah untuk melakukan setidaknya serta pengodean karat. Tujuan -tujuan ini telah tercapai.
Pengkodean ke UTF-8 harus cepat. (UTF-8 ke UTF-8 Encode harus setara dengan memcpy dan UTF-16 ke UTF-8 harus cepat.)
Kecepatan adalah non-goal saat pengkodean ke pengkodean warisan. Secara default, pengkodean ke pengkode warisan tidak boleh dioptimalkan untuk kecepatan dengan mengorbankan ukuran kode selama pengiriman formulir dan penguraian URL di tokek tidak menjadi terlalu lambat dalam penggunaan dunia nyata.
Demi ukuran biner, secara default, encoding_rs tidak memiliki tabel data spesifik encode di luar 32 bit data spesifik encode untuk setiap pengkodean byte tunggal. Oleh karena itu, encoder mencari tabel data yang dioptimalkan decode. Ini adalah pencarian linier dalam banyak kasus. Akibatnya, secara default, penyandian ke penyandian warisan bervariasi dari lambat hingga sangat lambat relatif terhadap perpustakaan lain. Namun, dengan beban kerja yang realistis, ini sepertinya cukup cepat untuk tidak menjadi pengguna yang lambat di Raspberry Pi 3 (yang berdiri untuk telepon untuk pengujian) dalam kasus penggunaan enkoder yang terpapar web.
Lihat fitur kargo di atas untuk secara opsional membuat warisan CJK menyandikan dengan cepat.
Kerangka kerja untuk mengukur kinerja tersedia secara terpisah.
Ini adalah tujuan untuk mendukung karat stabil terbaru, karat malam terbaru dan versi karat yang digunakan untuk Firefox malam.
Pada saat ini, tidak ada komitmen yang kuat untuk mendukung versi yang lebih tua dari apa yang dibutuhkan oleh Firefox, dan tidak ada komitmen untuk memperlakukan perubahan MSRV sebagai pemecahan semver, karena peti ini tergantung pada cfg-if , yang tampaknya tidak memperlakukan perubahan MSRV sebagai pemecahan semver, jadi tidak berguna bagi peti ini untuk memperlakukan perubahan MSRV sebagai pemecahan semver.
Pada 2024-11-01, MSRV tampaknya karat 1.40.0 untuk menggunakan peti dan 1.42.0 untuk tes DOC lulus tanpa kesalahan tentang alokasi global. Dengan fitur simd-accel , MSRV bahkan lebih tinggi.
Lapisan kompatibilitas yang mengimplementasikan API pengkodean karat di atas encoding_rs disediakan sebagai peti terpisah (tidak dapat diunggah ke peti.io). Lapisan kompatibilitas pada awalnya ditulis dengan aspsi bahwa Firefox akan membutuhkannya, tetapi saat ini tidak digunakan di Firefox.
Untuk meregenerasi kode yang dihasilkan:
https://github.com/hsivonen/encoding_c di sebelah direktori encoding_rs .https://github.com/hsivonen/codepage di sebelah direktori encoding_rs .https://github.com/whatwg/encoding di sebelah direktori encoding_rs .1d519bf8e5555cef64cf3a712485f41cd1a6a990 dari repo encoding . (Catatan: f381389 adalah revisi encoding yang digunakan dari sebelum perubahan lisensi repo encoding .)encoding_rs sebagai direktori yang berfungsi, jalankan python generate-encoding-data.py . usize bukan u8 sekaligus). alloc (dengan permukaan API yang lebih rendah). std::simdunsafe berdasarkan jenis yang lebih besar dari u8 / u16 ke align_to . portable_simd dari perpustakaan standar alih -alih peti packed_simd . Hanya mempengaruhi fitur malam opsional simd-accel .unsafe .rust-version ke Cargo.toml .packed_simd alih -alih packed_simd_2 lagi sekarang karena pembaruan kembali dengan nama packed_simd . Hanya mempengaruhi fitur malam opsional simd-accel .build.rs yang Dihapus. (Penghapusan ini harus menyelesaikan positif palsu yang dilaporkan oleh beberapa produk antivirus. Ini dapat merusak beberapa konfigurasi build yang telah memilih keluar dari jaminan Rust terhadap kerusakan build di masa depan.)no_std .no_std (dengan alloc ).simd-accel .packed_simd ke packed_simd_2 .cfg-if menjadi 1.0.cfg-if diperbarui ke Edition 2018 tanpa istirahat SEMVER.Decoder::latin1_byte_compatible_up_to tidak mengembalikan None dalam lebih banyak kasus untuk membuat metode ini benar -benar berguna. Meskipun ini bisa diperdebatkan sebagai perubahan yang melanggar karena perbaikan bug mengubah semantik, itu tidak mematahkan penelepon yang harus menangani kasus None dengan cara yang masuk akal.convert_str_to_utf16 .mem::convert_utf8_to_utf16_without_replacement .mem::utf8_latin1_up_to dan mem::str_latin1_up_to .Decoder::latin1_byte_compatible_up_to .bincode (DEV Dependency) ke 1.0.simd ke packed_simd .simd-accel (rilis hanya ReadMe).clippy:: awalan dari nama clippy lint.static saat mendefinisikan static lain).is_single_byte() pada Encoding .mem::decode_latin1() dan mem::encode_latin1_lossy() .--features simd-accel dengan kompiler saluran stabil untuk menyederhanakan sistem pembuatan firefox.is_foo_bidi() tidak memperlakukan u+feff (nol lebar no-break space alias. Byte order mark) sebagai hak-ke-kiri.is_foo_bidi() melaporkan true jika input berisi formulir presentasi bahasa Ibrani (yang merupakan hak-ke-kiri tetapi tidak dalam blok yang dilapisi jalan-ke-kiri).convert_utf16_to_latin1_lossy .mem menyatakan bahwa inputnya ada dalam kisaran U+0000 ... U+00FF (inklusif).mem memberikan konversi dari Latin1 dan UTF-16 ke UTF-8 yang dapat menangani ruang output yang tidak memadai. Idenya adalah menggunakannya terlebih dahulu dengan alokasi yang dibulatkan hingga ukuran ember Jemalloc dan melakukan alokasi terburuk hanya jika Jemalloc Rounding Up tidak cukup sebagai tebakan pertama.simd-accel -spesifik yang diperkenalkan dalam versi 0.8.1 dalam konversi antara UTF-16 dan Latin1 dalam modul mem .#[inline(never)] yang tidak dimaksudkan untuk rilis.mem untuk meningkatkan kinerja saat mengonversi buffer panjang.mem .mem .replacement label penyandian penggantian. (Perubahan spesifikasi.)Encoding::for_name() . ( Encoding::for_label(foo).unwrap() sekarang cukup dekat setelah perubahan label di atas.)parallel-utf8 .&'static Encoding .Encoder::has_pending_state() public.simd ke 0.2.0.7F dengan benar di ISO-2022-JP.Hash untuk Encoding .OutputFull InputEmpty pengkodean dengan penggantian dan buffer output yang dilewati terlalu pendek atau ruang yang tersisa dalam buffer output terlalu kecil setelah penggantian.PartialEq dan Eq untuk jenis CoderResult , DecoderResult dan EncoderResult .Encoder::encode_from_utf16 . (Karena pengawasan, itu tidak memiliki Encoder::encode_from_utf8 yang sudah ada.#[must_use] .parallel-utf8 ).simd-accel digunakan.Encoding dari const ke static untuk membuat referensi unik di seluruh peti yang menggunakan refernces.Encoding FOO_INIT yang tidak referensi untuk memungkinkan peti asing untuk menginisialisasi array static dengan referensi ke instance Encoding bahkan di bawah kendala Rust yang melarang inisialisasi item array yang dikode &'static Encoding dengan &'static Encoding statics .const untuk bekerja sehingga penggunaan silang membuat referensi unik.Cow S dari metode non-streaming khusus karat untuk mengkode dan kode kode.Encoding::for_bom() Mengembalikan panjang bom.simd-accel . (Membutuhkan karat malam.)Encoder.encode_from_utf8_to_vec_without_replacement() . Tambahkan Encoding.is_ascii_compatible() .
Tambahkan Encoding::for_bom() .
Make == Untuk Encoding penggunaan perbandingan nama alih -alih perbandingan pointer, karena penggunaan konstanta pengkodean dalam peti yang berbeda menghasilkan alamat yang berbeda dan konstanta tidak dapat diubah menjadi statika tanpa memecahkan hal -hal lain.
Rilis awal.