encoding_rs aspires to become an implementation of the Encoding Standard that
- Is written in Rust.
- Is suitable for use in Gecko as a replacement of uconv. (I.e. supports decoding to UTF-16 and encoding from UTF-16.)
- Is suitable for use in Rust code (both in Gecko and independently of Gecko). (I.e. supports decoding to UTF-8 and encoding from UTF-8 and provides an API compatible with at least the most common ways of using rust-encoding.)
Please see the file named COPYRIGHT.
Generated API documentation is available online.
For design considerations, please see the associated technical proposal to rewrite uconv in Rust.
For decoding to UTF-16, the goal is to perform at least as well as Gecko's old uconv. For decoding to UTF-8, the goal is to perform at least as well as rust-encoding.
Encoding to UTF-8 should be fast. (UTF-8 to UTF-8 encode should be equivalent
memcpy and UTF-16 to UTF-8 should be fast.)
Speed is a non-goal when encoding to legacy encodings. Encoding to legacy encodings should not be optimized for speed at the expense of code size as long as form submission and URL parsing in Gecko don't become noticeably too slow in real-world use.
A framework for measuring performance is available separately.
An FFI layer for encoding_rs is available as a separate crate.
Compatibility with rust-encoding
A compatibility layer that implements the rust-encoding API on top of encoding_rs is provided as a separate crate (cannot be uploaded to crates.io).
- Design the low-level API.
- Provide Rust-only convenience features (some BOM sniffing variants still TODO).
- Provide an stl/gsl-flavored C++ API.
- Implement all decoders and encoders.
- Add unit tests for all decoders and encoders.
- Finish BOM sniffing variants in Rust-only convenience features.
- Document the API.
- Publish the crate on crates.io.
- Create a solution for measuring performance.
- Accelerate ASCII conversions using SSE2 on x86.
- Accelerate ASCII conversions using ALU register-sized operations on
non-x86 architectures (process an
u8at a time).
- Split FFI into a separate crate so that the FFI doesn't interfere with LTO in pure-Rust usage.
- Compress CJK indices by making use of sequential code points as well as Unicode-ordered parts of indices.
- Make lookups by label or name use binary search that searches from the end of the label/name to the start.
- Make labels with non-ASCII bytes fail fast.
- Parallelize UTF-8 validation using Rayon.
- Provide an XPCOM/MFBT-flavored C++ API.
- Investigate accelerating single-byte encode with a single fast-tracked range per encoding.
- Replace uconv with encoding_rs in Gecko.
- Implement the rust-encoding API in terms of encoding_rs.
- Investigate the use of NEON on newer ARM CPUs that have a lesser penalty on data flow from NEON to ALU registers.
- Investigate Björn Höhrmann's lookup table acceleration for UTF-8 as adapted to Rust in rust-encoding.
- Reserve enough space for NCRs when encoding to ISO-2022-JP.
- Correct max length calculations for multibyte decoders.
- Correct max length calculations before BOM sniffing has been performed.
- Correctly calculate max length when encoding from UTF-16 to GBK.
- Don't prepend anything when gb18030 range decode fails. (Spec change.)
- Correcly handle the case where the first buffer contains potentially partial BOM and the next buffer is the last buffer.
- Decode byte
7Fcorrectly in ISO-2022-JP.
- Make UTF-16 to UTF-8 encode write closer to the end of the buffer.
- Map half-width katakana to full-width katana in ISO-2022-JP encoder. (Spec change.)
InputEmptycorrect precedence over
OutputFullwhen encoding with replacement and the output buffer passed in is too short or the remaining space in the output buffer is too small after a replacement.
- Correct max length calculation when a partial BOM prefix is part of the decoder's state.
- Correct max length calculation in various encoders.
- Correct max length calculation in the UTF-16 decoder.
- Avoid panic when encoding with replacement and the destination buffer is too short to hold one numeric character reference.
- Add support for 32-bit big-endian hosts. (For real this time.)
- Fix a panic from subslicing with bad indices in
Encoder::encode_from_utf16. (Due to an oversight, it lacked the fix that
- Micro-optimize error status accumulation in non-streaming case.
- Avoid panic near integer overflow in a case that's unlikely to actually happen.
- Address Clippy lints.
- Make the methods for computing worst-case buffer size requirements check for integer overflow.
- Upgrade rayon to 0.7.0.
- Reorder methods for better documentation readability.
- Add support for big-endian hosts. (Only 64-bit case actually tested.)
- Optimize the ALU (non-SIMD) case for 32-bit ARM instead of x86_64.
- Avoid allocating an excessively long buffers in non-streaming decode.
- Fix the behavior of ISO-2022-JP and replacement decoders near the end of the output buffer.
- Annotate the result structs with
- Split FFI into a separate crate.
- Performance tweaks.
- CJK binary size and encoding performance changes.
- Parallelize UTF-8 validation in the case of long buffers (with optional
- Borrow even with ISO-2022-JP when possible.
- Fix moving pointers to alignment in ALU-based ASCII acceleration.
- Fix errors in documentation and improve documentation.
- Fix UTF-8 to UTF-16 decode for byte sequences beginning with 0xEE.
- Make UTF-8 to UTF-8 decode SSE2-accelerated when feature
- When decoding and encoding ASCII-only input from or to an ASCII-compatible encoding using the non-streaming API, return a borrow of the input.
- Make encode from UTF-16 to UTF-8 faster.
- Change the references to the instances of
staticto make the referents unique across crates that use the refernces.
- Introduce non-reference-typed
Encodingto allow foreign crates to initialize
staticarrays with references to
Encodinginstances even under Rust's constraints that prohibit the initialization of
&'static Encoding-typed array items with
- Document that the above two points will be reverted if Rust changes
constto work so that cross-crate usage keeps the referents unique.
Cows from Rust-only non-streaming methods for encode and decode.
Encoding::for_bom()returns the length of the BOM.
- ASCII-accelerated conversions for encodings other than UTF-16LE, UTF-16BE, ISO-2022-JP and x-user-defined.
- Add SSE2 acceleration behind the
simd-accelfeature flag. (Requires nightly Rust.)
- Fix panic with long bogus labels.
- Map 0xCA to U+05BA in windows-1255. (Spec change.)
- Correct the end of the Shift_JIS EUDC range. (Spec change.)
- Polish FFI documentation.
- Fix UTF-16 to UTF-8 encode.
Encodinguse name comparison instead of pointer comparison, because uses of the encoding constants in different crates result in different addresses and the constant cannot be turned into statics without breaking other things.
The initial release.