summaryrefslogtreecommitdiffstats
path: root/third_party/rust/encoding_rs/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/encoding_rs/README.md')
-rw-r--r--third_party/rust/encoding_rs/README.md831
1 files changed, 831 insertions, 0 deletions
diff --git a/third_party/rust/encoding_rs/README.md b/third_party/rust/encoding_rs/README.md
new file mode 100644
index 0000000000..c0b596c951
--- /dev/null
+++ b/third_party/rust/encoding_rs/README.md
@@ -0,0 +1,831 @@
+# encoding_rs
+
+[![Build Status](https://travis-ci.org/hsivonen/encoding_rs.svg?branch=master)](https://travis-ci.org/hsivonen/encoding_rs)
+[![crates.io](https://img.shields.io/crates/v/encoding_rs.svg)](https://crates.io/crates/encoding_rs)
+[![docs.rs](https://docs.rs/encoding_rs/badge.svg)](https://docs.rs/encoding_rs/)
+
+encoding_rs an implementation of the (non-JavaScript parts of) the
+[Encoding Standard](https://encoding.spec.whatwg.org/) written in Rust.
+
+The Encoding Standard defines the Web-compatible set of character encodings,
+which means this crate can be used to decode Web content. encoding_rs is
+used in Gecko starting with Firefox 56. Due to the notable overlap between
+the legacy encodings on the Web and the legacy encodings used on Windows,
+this crate may be of use for non-Web-related situations as well; see below
+for links to adjacent crates.
+
+Additionally, the `mem` module provides various operations for dealing with
+in-RAM text (as opposed to data that's coming from or going to an IO boundary).
+The `mem` module is a module instead of a separate crate due to internal
+implementation detail efficiencies.
+
+## Functionality
+
+Due to the Gecko use case, encoding_rs supports decoding to and encoding from
+UTF-16 in addition to supporting the usual Rust use case of decoding to and
+encoding from UTF-8. Additionally, the API has been designed to be FFI-friendly
+to accommodate the C++ side of Gecko.
+
+Specifically, encoding_rs does the following:
+
+* Decodes a stream of bytes in an Encoding Standard-defined character encoding
+ into valid aligned native-endian in-RAM UTF-16 (units of `u16` / `char16_t`).
+* Encodes a stream of potentially-invalid aligned native-endian in-RAM UTF-16
+ (units of `u16` / `char16_t`) into a sequence of bytes in an Encoding
+ Standard-defined character encoding as if the lone surrogates had been
+ replaced with the REPLACEMENT CHARACTER before performing the encode.
+ (Gecko's UTF-16 is potentially invalid.)
+* Decodes a stream of bytes in an Encoding Standard-defined character
+ encoding into valid UTF-8.
+* Encodes a stream of valid UTF-8 into a sequence of bytes in an Encoding
+ Standard-defined character encoding. (Rust's UTF-8 is guaranteed-valid.)
+* Does the above in streaming (input and output split across multiple
+ buffers) and non-streaming (whole input in a single buffer and whole
+ output in a single buffer) variants.
+* Avoids copying (borrows) when possible in the non-streaming cases when
+ decoding to or encoding from UTF-8.
+* Resolves textual labels that identify character encodings in
+ protocol text into type-safe objects representing the those encodings
+ conceptually.
+* Maps the type-safe encoding objects onto strings suitable for
+ returning from `document.characterSet`.
+* Validates UTF-8 (in common instruction set scenarios a bit faster for Web
+ workloads than the standard library; hopefully will get upstreamed some
+ day) and ASCII.
+
+Additionally, `encoding_rs::mem` does the following:
+
+* Checks if a byte buffer contains only ASCII.
+* Checks if a potentially-invalid UTF-16 buffer contains only Basic Latin (ASCII).
+* Checks if a valid UTF-8, potentially-invalid UTF-8 or potentially-invalid UTF-16
+ buffer contains only Latin1 code points (below U+0100).
+* Checks if a valid UTF-8, potentially-invalid UTF-8 or potentially-invalid UTF-16
+ buffer or a code point or a UTF-16 code unit can trigger right-to-left behavior
+ (suitable for checking if the Unicode Bidirectional Algorithm can be optimized
+ out).
+* Combined versions of the above two checks.
+* Converts valid UTF-8, potentially-invalid UTF-8 and Latin1 to UTF-16.
+* Converts potentially-invalid UTF-16 and Latin1 to UTF-8.
+* Converts UTF-8 and UTF-16 to Latin1 (if in range).
+* Finds the first invalid code unit in a buffer of potentially-invalid UTF-16.
+* Makes a mutable buffer of potential-invalid UTF-16 contain valid UTF-16.
+* Copies ASCII from one buffer to another up to the first non-ASCII byte.
+* Converts ASCII to UTF-16 up to the first non-ASCII byte.
+* Converts UTF-16 to ASCII up to the first non-Basic Latin code unit.
+
+## Integration with `std::io`
+
+Notably, the above feature list doesn't include the capability to wrap
+a `std::io::Read`, decode it into UTF-8 and presenting the result via
+`std::io::Read`. The [`encoding_rs_io`](https://crates.io/crates/encoding_rs_io)
+crate provides that capability.
+
+## `no_std` Environment
+
+The crate works in a `no_std` environment. By default, the `alloc` feature,
+which assumes that an allocator is present is enabled. For a no-allocator
+environment, the default features (i.e. `alloc`) can be turned off. This
+makes the part of the API that returns `Vec`/`String`/`Cow` unavailable.
+
+## Decoding Email
+
+For decoding character encodings that occur in email, use the
+[`charset`](https://crates.io/crates/charset) crate instead of using this
+one directly. (It wraps this crate and adds UTF-7 decoding.)
+
+## Windows Code Page Identifier Mappings
+
+For mappings to and from Windows code page identifiers, use the
+[`codepage`](https://crates.io/crates/codepage) crate.
+
+## DOS Encodings
+
+This crate does not support single-byte DOS encodings that aren't required by
+the Web Platform, but the [`oem_cp`](https://crates.io/crates/oem_cp) crate does.
+
+## Preparing Text for the Encoders
+
+Normalizing text into Unicode Normalization Form C prior to encoding text into
+a legacy encoding minimizes unmappable characters. Text can be normalized to
+Unicode Normalization Form C using the
+[`unic-normal`](https://crates.io/crates/unic-normal) crate.
+
+The exception is windows-1258, which after normalizing to Unicode Normalization
+Form C requires tone marks to be decomposed in order to minimize unmappable
+characters. Vietnamese tone marks can be decomposed using the
+[`detone`](https://crates.io/crates/detone) crate.
+
+## Licensing
+
+TL;DR: `(Apache-2.0 OR MIT) AND BSD-3-Clause` for the code and data combination.
+
+Please see the file named
+[COPYRIGHT](https://github.com/hsivonen/encoding_rs/blob/master/COPYRIGHT).
+
+The non-test code that isn't generated from the WHATWG data in this crate is
+under Apache-2.0 OR MIT. Test code is under CC0.
+
+This crate contains code/data generated from WHATWG-supplied data. The WHATWG
+upstream changed its license for portions of specs incorporated into source code
+from CC0 to BSD-3-Clause between the initial release of this crate and the present
+version of this crate. The in-source licensing legends have been updated for the
+parts of the generated code that have changed since the upstream license change.
+
+## Documentation
+
+Generated [API documentation](https://docs.rs/encoding_rs/) is available
+online.
+
+There is a [long-form write-up](https://hsivonen.fi/encoding_rs/) about the
+design and internals of the crate.
+
+## C and C++ bindings
+
+An FFI layer for encoding_rs is available as a
+[separate crate](https://github.com/hsivonen/encoding_c). The crate comes
+with a [demo C++ wrapper](https://github.com/hsivonen/encoding_c/blob/master/include/encoding_rs_cpp.h)
+using the C++ standard library and [GSL](https://github.com/Microsoft/GSL/) types.
+
+The bindings for the `mem` module are in the
+[encoding_c_mem crate](https://github.com/hsivonen/encoding_c_mem).
+
+For the Gecko context, there's a
+[C++ wrapper using the MFBT/XPCOM types](https://searchfox.org/mozilla-central/source/intl/Encoding.h#100).
+
+There's a [write-up](https://hsivonen.fi/modern-cpp-in-rust/) about the C++
+wrappers.
+
+## Sample programs
+
+* [Rust](https://github.com/hsivonen/recode_rs)
+* [C](https://github.com/hsivonen/recode_c)
+* [C++](https://github.com/hsivonen/recode_cpp)
+
+## Optional features
+
+There are currently these optional cargo features:
+
+### `simd-accel`
+
+Enables SIMD acceleration using the nightly-dependent `packed_simd` crate.
+
+This is an opt-in feature, because enabling this feature _opts out_ of Rust's
+guarantees of future compilers compiling old code (aka. "stability story").
+
+Currently, this has not been tested to be an improvement except for these
+targets:
+
+* x86_64
+* i686
+* aarch64
+* thumbv7neon
+
+If you use nightly Rust, you use targets whose first component is one of the
+above, and you are prepared _to have to revise your configuration when updating
+Rust_, you should enable this feature. Otherwise, please _do not_ enable this
+feature.
+
+_Note!_ If you are compiling for a target that does not have 128-bit SIMD
+enabled as part of the target definition and you are enabling 128-bit SIMD
+using `-C target_feature`, you need to enable the `core_arch` Cargo feature
+for `packed_simd` to compile a crates.io snapshot of `core_arch` instead of
+using the standard-library copy of `core::arch`, because the `core::arch`
+module of the pre-compiled standard library has been compiled with the
+assumption that the CPU doesn't have 128-bit SIMD. At present this applies
+mainly to 32-bit ARM targets whose first component does not include the
+substring `neon`.
+
+The encoding_rs side of things has not been properly set up for POWER,
+PowerPC, MIPS, etc., SIMD at this time, so even if you were to follow
+the advice from the previous paragraph, you probably shouldn't use
+the `simd-accel` option on the less mainstream architectures at this
+time.
+
+Used by Firefox.
+
+### `serde`
+
+Enables support for serializing and deserializing `&'static Encoding`-typed
+struct fields using [Serde][1].
+
+[1]: https://serde.rs/
+
+Not used by Firefox.
+
+### `fast-legacy-encode`
+
+A catch-all option for enabling the fastest legacy encode options. _Does not
+affect decode speed or UTF-8 encode speed._
+
+At present, this option is equivalent to enabling the following options:
+ * `fast-hangul-encode`
+ * `fast-hanja-encode`
+ * `fast-kanji-encode`
+ * `fast-gb-hanzi-encode`
+ * `fast-big5-hanzi-encode`
+
+Adds 176 KB to the binary size.
+
+Not used by Firefox.
+
+### `fast-hangul-encode`
+
+Changes encoding precomposed Hangul syllables into EUC-KR from binary
+search over the decode-optimized tables to lookup by index making Korean
+plain-text encode about 4 times as fast as without this option.
+
+Adds 20 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-hanja-encode`
+
+Changes encoding of Hanja into EUC-KR from linear search over the
+decode-optimized table to lookup by index. Since Hanja is practically absent
+in modern Korean text, this option doesn't affect perfomance in the common
+case and mainly makes sense if you want to make your application resilient
+agaist denial of service by someone intentionally feeding it a lot of Hanja
+to encode into EUC-KR.
+
+Adds 40 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-kanji-encode`
+
+Changes encoding of Kanji into Shift_JIS, EUC-JP and ISO-2022-JP from linear
+search over the decode-optimized tables to lookup by index making Japanese
+plain-text encode to legacy encodings 30 to 50 times as fast as without this
+option (about 2 times as fast as with `less-slow-kanji-encode`).
+
+Takes precedence over `less-slow-kanji-encode`.
+
+Adds 36 KB to the binary size (24 KB compared to `less-slow-kanji-encode`).
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `less-slow-kanji-encode`
+
+Makes JIS X 0208 Level 1 Kanji (the most common Kanji in Shift_JIS, EUC-JP and
+ISO-2022-JP) encode less slow (binary search instead of linear search) making
+Japanese plain-text encode to legacy encodings 14 to 23 times as fast as
+without this option.
+
+Adds 12 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-gb-hanzi-encode`
+
+Changes encoding of Hanzi in the CJK Unified Ideographs block into GBK and
+gb18030 from linear search over a part the decode-optimized tables followed
+by a binary search over another part of the decode-optimized tables to lookup
+by index making Simplified Chinese plain-text encode to the legacy encodings
+100 to 110 times as fast as without this option (about 2.5 times as fast as
+with `less-slow-gb-hanzi-encode`).
+
+Takes precedence over `less-slow-gb-hanzi-encode`.
+
+Adds 36 KB to the binary size (24 KB compared to `less-slow-gb-hanzi-encode`).
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `less-slow-gb-hanzi-encode`
+
+Makes GB2312 Level 1 Hanzi (the most common Hanzi in gb18030 and GBK) encode
+less slow (binary search instead of linear search) making Simplified Chinese
+plain-text encode to the legacy encodings about 40 times as fast as without
+this option.
+
+Adds 12 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `fast-big5-hanzi-encode`
+
+Changes encoding of Hanzi in the CJK Unified Ideographs block into Big5 from
+linear search over a part the decode-optimized tables to lookup by index
+making Traditional Chinese plain-text encode to Big5 105 to 125 times as fast
+as without this option (about 3 times as fast as with
+`less-slow-big5-hanzi-encode`).
+
+Takes precedence over `less-slow-big5-hanzi-encode`.
+
+Adds 40 KB to the binary size (20 KB compared to `less-slow-big5-hanzi-encode`).
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+### `less-slow-big5-hanzi-encode`
+
+Makes Big5 Level 1 Hanzi (the most common Hanzi in Big5) encode less slow
+(binary search instead of linear search) making Traditional Chinese
+plain-text encode to Big5 about 36 times as fast as without this option.
+
+Adds 20 KB to the binary size.
+
+Does _not_ affect decode speed.
+
+Not used by Firefox.
+
+## Performance goals
+
+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. These goals have been achieved.
+
+Encoding to UTF-8 should be fast. (UTF-8 to UTF-8 encode should be equivalent
+to `memcpy` and UTF-16 to UTF-8 should be fast.)
+
+Speed is a non-goal when encoding to legacy encodings. By default, 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.
+
+In the interest of binary size, by default, encoding_rs does not have
+encode-specific data tables beyond 32 bits of encode-specific data for each
+single-byte encoding. Therefore, encoders search the decode-optimized data
+tables. This is a linear search in most cases. As a result, by default, encode
+to legacy encodings varies from slow to extremely slow relative to other
+libraries. Still, with realistic work loads, this seemed fast enough not to be
+user-visibly slow on Raspberry Pi 3 (which stood in for a phone for testing)
+in the Web-exposed encoder use cases.
+
+See the cargo features above for optionally making CJK legacy encode fast.
+
+A framework for measuring performance is [available separately][2].
+
+[2]: https://github.com/hsivonen/encoding_bench/
+
+## Rust Version Compatibility
+
+It is a goal to support the latest stable Rust, the latest nightly Rust and
+the version of Rust that's used for Firefox Nightly.
+
+At this time, there is no firm commitment to support a version older than
+what's required by Firefox, and there is no commitment to treat MSRV changes
+as semver-breaking, because this crate depends on `cfg-if`, which doesn't
+appear to treat MSRV changes as semver-breaking, so it would be useless for
+this crate to treat MSRV changes as semver-breaking.
+
+As of 2021-02-04, MSRV appears to be Rust 1.36.0 for using the crate and
+1.42.0 for doc tests to pass without errors about the global allocator.
+
+## Compatibility with rust-encoding
+
+A compatibility layer that implements the rust-encoding API on top of
+encoding_rs is
+[provided as a separate crate](https://github.com/hsivonen/encoding_rs_compat)
+(cannot be uploaded to crates.io). The compatibility layer was originally
+written with the assuption that Firefox would need it, but it is not currently
+used in Firefox.
+
+## Regenerating Generated Code
+
+To regenerate the generated code:
+
+ * Have Python 2 installed.
+ * Clone [`https://github.com/hsivonen/encoding_c`](https://github.com/hsivonen/encoding_c)
+ next to the `encoding_rs` directory.
+ * Clone [`https://github.com/hsivonen/codepage`](https://github.com/hsivonen/codepage)
+ next to the `encoding_rs` directory.
+ * Clone [`https://github.com/whatwg/encoding`](https://github.com/whatwg/encoding)
+ next to the `encoding_rs` directory.
+ * Checkout revision `be3337450e7df1c49dca7872153c4c4670dd8256` of the `encoding` repo.
+ (Note: `f381389` was the revision of `encoding` used from before the `encoding` repo
+ license change. So far, only output changed since then has been updated to
+ the new license legend.)
+ * With the `encoding_rs` directory as the working directory, run
+ `python generate-encoding-data.py`.
+
+## Roadmap
+
+- [x] Design the low-level API.
+- [x] Provide Rust-only convenience features.
+- [x] Provide an stl/gsl-flavored C++ API.
+- [x] Implement all decoders and encoders.
+- [x] Add unit tests for all decoders and encoders.
+- [x] Finish BOM sniffing variants in Rust-only convenience features.
+- [x] Document the API.
+- [x] Publish the crate on crates.io.
+- [x] Create a solution for measuring performance.
+- [x] Accelerate ASCII conversions using SSE2 on x86.
+- [x] Accelerate ASCII conversions using ALU register-sized operations on
+ non-x86 architectures (process an `usize` instead of `u8` at a time).
+- [x] Split FFI into a separate crate so that the FFI doesn't interfere with
+ LTO in pure-Rust usage.
+- [x] Compress CJK indices by making use of sequential code points as well
+ as Unicode-ordered parts of indices.
+- [x] Make lookups by label or name use binary search that searches from the
+ end of the label/name to the start.
+- [x] Make labels with non-ASCII bytes fail fast.
+- [ ] ~Parallelize UTF-8 validation using [Rayon](https://github.com/nikomatsakis/rayon).~
+ (This turned out to be a pessimization in the ASCII case due to memory bandwidth reasons.)
+- [x] Provide an XPCOM/MFBT-flavored C++ API.
+- [x] Investigate accelerating single-byte encode with a single fast-tracked
+ range per encoding.
+- [x] Replace uconv with encoding_rs in Gecko.
+- [x] Implement the rust-encoding API in terms of encoding_rs.
+- [x] Add SIMD acceleration for Aarch64.
+- [x] Investigate the use of NEON on 32-bit ARM.
+- [ ] ~Investigate Björn Höhrmann's lookup table acceleration for UTF-8 as
+ adapted to Rust in rust-encoding.~
+- [x] Add actually fast CJK encode options.
+- [ ] ~Investigate [Bob Steagall's lookup table acceleration for UTF-8](https://github.com/BobSteagall/CppNow2018/blob/master/FastConversionFromUTF-8/Fast%20Conversion%20From%20UTF-8%20with%20C%2B%2B%2C%20DFAs%2C%20and%20SSE%20Intrinsics%20-%20Bob%20Steagall%20-%20C%2B%2BNow%202018.pdf).~
+- [x] Provide a build mode that works without `alloc` (with lesser API surface).
+- [ ] Migrate to `std::simd` once it is stable and declare 1.0.
+
+## Release Notes
+
+### 0.8.33
+
+* Use `packed_simd` instead of `packed_simd_2` again now that updates are back under the `packed_simd` name. Only affects the `simd-accel` optional nightly feature.
+
+### 0.8.32
+
+* Removed `build.rs`. (This removal should resolve false positives reported by some antivirus products. This may break some build configurations that have opted out of Rust's guarantees against future build breakage.)
+* Internal change to what API is used for reinterpreting the lane configuration of SIMD vectors.
+* Documentation improvements.
+
+### 0.8.31
+
+* Use SPDX with parentheses now that crates.io supports parentheses.
+
+### 0.8.30
+
+* Update the licensing information to take into account the WHATWG data license change.
+
+### 0.8.29
+
+* Make the parts that use an allocator optional.
+
+### 0.8.28
+
+* Fix error in Serde support introduced as part of `no_std` support.
+
+### 0.8.27
+
+* Make the crate works in a `no_std` environment (with `alloc`).
+
+### 0.8.26
+
+* Fix oversights in edition 2018 migration that broke the `simd-accel` feature.
+
+### 0.8.25
+
+* Do pointer alignment checks in a way where intermediate steps aren't defined to be Undefined Behavior.
+* Update the `packed_simd` dependency to `packed_simd_2`.
+* Update the `cfg-if` dependency to 1.0.
+* Address warnings that have been introduced by newer Rust versions along the way.
+* Update to edition 2018, since even prior to 1.0 `cfg-if` updated to edition 2018 without a semver break.
+
+### 0.8.24
+
+* Avoid computing an intermediate (not dereferenced) pointer value in a manner designated as Undefined Behavior when computing pointer alignment.
+
+### 0.8.23
+
+* Remove year from copyright notices. (No features or bug fixes.)
+
+### 0.8.22
+
+* Formatting fix and new unit test. (No features or bug fixes.)
+
+### 0.8.21
+
+* Fixed a panic with invalid UTF-16[BE|LE] input at the end of the stream.
+
+### 0.8.20
+
+* Make `Decoder::latin1_byte_compatible_up_to` return `None` in more
+ cases to make the method actually useful. While this could be argued
+ to be a breaking change due to the bug fix changing semantics, it does
+ not break callers that had to handle the `None` case in a reasonable
+ way anyway.
+
+### 0.8.19
+
+* Removed a bunch of bound checks in `convert_str_to_utf16`.
+* Added `mem::convert_utf8_to_utf16_without_replacement`.
+
+### 0.8.18
+
+* Added `mem::utf8_latin1_up_to` and `mem::str_latin1_up_to`.
+* Added `Decoder::latin1_byte_compatible_up_to`.
+
+### 0.8.17
+
+* Update `bincode` (dev dependency) version requirement to 1.0.
+
+### 0.8.16
+
+* Switch from the `simd` crate to `packed_simd`.
+
+### 0.8.15
+
+* Adjust documentation for `simd-accel` (README-only release).
+
+### 0.8.14
+
+* Made UTF-16 to UTF-8 encode conversion fill the output buffer as
+ closely as possible.
+
+### 0.8.13
+
+* Made the UTF-8 to UTF-16 decoder compare the number of code units written
+ with the length of the right slice (the output slice) to fix a panic
+ introduced in 0.8.11.
+
+### 0.8.12
+
+* Removed the `clippy::` prefix from clippy lint names.
+
+### 0.8.11
+
+* Changed minimum Rust requirement to 1.29.0 (for the ability to refer
+ to the interior of a `static` when defining another `static`).
+* Explicitly aligned the lookup tables for single-byte encodings and
+ UTF-8 to cache lines in the hope of freeing up one cache line for
+ other data. (Perhaps the tables were already aligned and this is
+ placebo.)
+* Added 32 bits of encode-oriented data for each single-byte encoding.
+ The change was performance-neutral for non-Latin1-ish Latin legacy
+ encodings, improved Latin1-ish and Arabic legacy encode speed
+ somewhat (new speed is 2.4x the old speed for German, 2.3x for
+ Arabic, 1.7x for Portuguese and 1.4x for French) and improved
+ non-Latin1, non-Arabic legacy single-byte encode a lot (7.2x for
+ Thai, 6x for Greek, 5x for Russian, 4x for Hebrew).
+* Added compile-time options for fast CJK legacy encode options (at
+ the cost of binary size (up to 176 KB) and run-time memory usage).
+ These options still retain the overall code structure instead of
+ rewriting the CJK encoders totally, so the speed isn't as good as
+ what could be achieved by using even more memory / making the
+ binary even langer.
+* Made UTF-8 decode and validation faster.
+* Added method `is_single_byte()` on `Encoding`.
+* Added `mem::decode_latin1()` and `mem::encode_latin1_lossy()`.
+
+### 0.8.10
+
+* Disabled a unit test that tests a panic condition when the assertion
+ being tested is disabled.
+
+### 0.8.9
+
+* Made `--features simd-accel` work with stable-channel compiler to
+ simplify the Firefox build system.
+
+### 0.8.8
+
+* Made the `is_foo_bidi()` not treat U+FEFF (ZERO WIDTH NO-BREAK SPACE
+ aka. BYTE ORDER MARK) as right-to-left.
+* Made the `is_foo_bidi()` functions report `true` if the input contains
+ Hebrew presentations forms (which are right-to-left but not in a
+ right-to-left-roadmapped block).
+
+### 0.8.7
+
+* Fixed a panic in the UTF-16LE/UTF-16BE decoder when decoding to UTF-8.
+
+### 0.8.6
+
+* Temporarily removed the debug assertion added in version 0.8.5 from
+ `convert_utf16_to_latin1_lossy`.
+
+### 0.8.5
+
+* If debug assertions are enabled but fuzzing isn't enabled, lossy conversions
+ to Latin1 in the `mem` module assert that the input is in the range
+ U+0000...U+00FF (inclusive).
+* In the `mem` module provide conversions from Latin1 and UTF-16 to UTF-8
+ that can deal with insufficient output space. The idea is to use them
+ first with an allocation rounded up to jemalloc bucket size and do the
+ worst-case allocation only if the jemalloc rounding up was insufficient
+ as the first guess.
+
+### 0.8.4
+
+* Fix SSE2-specific, `simd-accel`-specific memory corruption introduced in
+ version 0.8.1 in conversions between UTF-16 and Latin1 in the `mem` module.
+
+### 0.8.3
+
+* Removed an `#[inline(never)]` annotation that was not meant for release.
+
+### 0.8.2
+
+* Made non-ASCII UTF-16 to UTF-8 encode faster by manually omitting bound
+ checks and manually adding branch prediction annotations.
+
+### 0.8.1
+
+* Tweaked loop unrolling and memory alignment for SSE2 conversions between
+ UTF-16 and Latin1 in the `mem` module to increase the performance when
+ converting long buffers.
+
+### 0.8.0
+
+* Changed the minimum supported version of Rust to 1.21.0 (semver breaking
+ change).
+* Flipped around the defaults vs. optional features for controlling the size
+ vs. speed trade-off for Kanji and Hanzi legacy encode (semver breaking
+ change).
+* Added NEON support on ARMv7.
+* SIMD-accelerated x-user-defined to UTF-16 decode.
+* Made UTF-16LE and UTF-16BE decode a lot faster (including SIMD
+ acceleration).
+
+### 0.7.2
+
+* Add the `mem` module.
+* Refactor SIMD code which can affect performance outside the `mem`
+ module.
+
+### 0.7.1
+
+* When encoding from invalid UTF-16, correctly handle U+DC00 followed by
+ another low surrogate.
+
+### 0.7.0
+
+* [Make `replacement` a label of the replacement
+ encoding.](https://github.com/whatwg/encoding/issues/70) (Spec change.)
+* Remove `Encoding::for_name()`. (`Encoding::for_label(foo).unwrap()` is
+ now close enough after the above label change.)
+* Remove the `parallel-utf8` cargo feature.
+* Add optional Serde support for `&'static Encoding`.
+* Performance tweaks for ASCII handling.
+* Performance tweaks for UTF-8 validation.
+* SIMD support on aarch64.
+
+### 0.6.11
+
+* Make `Encoder::has_pending_state()` public.
+* Update the `simd` crate dependency to 0.2.0.
+
+### 0.6.10
+
+* 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.
+
+### 0.6.9
+
+* [Don't prepend anything when gb18030 range decode
+ fails](https://github.com/whatwg/encoding/issues/110). (Spec change.)
+
+### 0.6.8
+
+* Correcly handle the case where the first buffer contains potentially
+ partial BOM and the next buffer is the last buffer.
+* Decode byte `7F` correctly in ISO-2022-JP.
+* Make UTF-16 to UTF-8 encode write closer to the end of the buffer.
+* Implement `Hash` for `Encoding`.
+
+### 0.6.7
+
+* [Map half-width katakana to full-width katana in ISO-2022-JP
+ encoder](https://github.com/whatwg/encoding/issues/105). (Spec change.)
+* Give `InputEmpty` correct precedence over `OutputFull` when 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.
+
+### 0.6.6
+
+* Correct max length calculation when a partial BOM prefix is part of
+ the decoder's state.
+
+### 0.6.5
+
+* Correct max length calculation in various encoders.
+* Correct max length calculation in the UTF-16 decoder.
+* Derive `PartialEq` and `Eq` for the `CoderResult`, `DecoderResult`
+ and `EncoderResult` types.
+
+### 0.6.4
+
+* Avoid panic when encoding with replacement and the destination buffer is
+ too short to hold one numeric character reference.
+
+### 0.6.3
+
+* Add support for 32-bit big-endian hosts. (For real this time.)
+
+### 0.6.2
+
+* Fix a panic from subslicing with bad indices in
+ `Encoder::encode_from_utf16`. (Due to an oversight, it lacked the fix that
+ `Encoder::encode_from_utf8` already had.)
+* Micro-optimize error status accumulation in non-streaming case.
+
+### 0.6.1
+
+* Avoid panic near integer overflow in a case that's unlikely to actually
+ happen.
+* Address Clippy lints.
+
+### 0.6.0
+
+* Make the methods for computing worst-case buffer size requirements check
+ for integer overflow.
+* Upgrade rayon to 0.7.0.
+
+### 0.5.1
+
+* 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.
+
+### 0.5.0
+
+* 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 `#[must_use]`.
+
+### 0.4.0
+
+* 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
+ feature `parallel-utf8`).
+* Borrow even with ISO-2022-JP when possible.
+
+### 0.3.2
+
+* Fix moving pointers to alignment in ALU-based ASCII acceleration.
+* Fix errors in documentation and improve documentation.
+
+### 0.3.1
+
+* Fix UTF-8 to UTF-16 decode for byte sequences beginning with 0xEE.
+* Make UTF-8 to UTF-8 decode SSE2-accelerated when feature `simd-accel` is used.
+* 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.
+
+### 0.3
+
+* Change the references to the instances of `Encoding` from `const` to `static`
+ to make the referents unique across crates that use the refernces.
+* Introduce non-reference-typed `FOO_INIT` instances of `Encoding` to allow
+ foreign crates to initialize `static` arrays with references to `Encoding`
+ instances even under Rust's constraints that prohibit the initialization of
+ `&'static Encoding`-typed array items with `&'static Encoding`-typed
+ `statics`.
+* Document that the above two points will be reverted if Rust changes `const`
+ to work so that cross-crate usage keeps the referents unique.
+* Return `Cow`s 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-accel` feature flag. (Requires
+ nightly Rust.)
+* Fix panic with long bogus labels.
+* Map [0xCA to U+05BA in windows-1255](https://github.com/whatwg/encoding/issues/73).
+ (Spec change.)
+* Correct the [end of the Shift_JIS EUDC range](https://github.com/whatwg/encoding/issues/53).
+ (Spec change.)
+
+### 0.2.4
+
+* Polish FFI documentation.
+
+### 0.2.3
+
+* Fix UTF-16 to UTF-8 encode.
+
+### 0.2.2
+
+* Add `Encoder.encode_from_utf8_to_vec_without_replacement()`.
+
+### 0.2.1
+
+* Add `Encoding.is_ascii_compatible()`.
+
+* Add `Encoding::for_bom()`.
+
+* Make `==` for `Encoding` use 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.
+
+### 0.2.0
+
+The initial release.