encoding_rsさびに記載されているエンコーディング標準の(javascript以外の部分)の実装。
エンコーディング標準は、Web互換の文字エンコーディングのセットを定義します。つまり、このクレートを使用してWebコンテンツをデコードできます。 Encoding_RSは、Firefox 56から始まるGeckoで使用されます。Web上のレガシーエンコーディングとWindowsで使用されるレガシーエンコーディングとの間に顕著なオーバーラップがあるため、このクレートは非Web関連の状況にも使用できます。隣接する木枠へのリンクについては、以下を参照してください。
さらに、 memモジュールは、IO境界からのデータとは対照的に、RAMインチテキストを扱うためのさまざまな操作を提供します。 memモジュールは、内部実装の詳細効率のため、個別のクレートの代わりにモジュールです。
Geckoユースケースのため、Encoding_RSは、UTF-8へのデコードとエンコードの通常の錆ユースケースをサポートすることに加えて、UTF-16へのデコードとエンコードをサポートします。さらに、APIは、GeckoのC ++側面に対応するためにFFIに優しいように設計されています。
具体的には、encoding_rsは次のことを行います。
u16 / char16_tの単位)にエンコードするエンコード標準定義の文字でバイトのストリームを解読します。u16 / char16_t単位)のバイトシーケンスのシーケンスにエンコードします。 (GeckoのUTF-16は潜在的に無効です。)document.characterSetから戻るのに適した文字列にオブジェクトを型にエンコードする型エンコードをマップします。さらに、 encoding_rs::mem次のことを行います。
std::ioとの統合特に、上記の機能リストにstd::io::Readをラップする機能は含まれていません。これをUTF-8にデコードし、 std::io::Readを介して結果を表示します。 encoding_rs_ioクレートは、その機能を提供します。
no_std環境クレートはno_std環境で動作します。デフォルトでは、アロックが存在することを想定しているalloc機能が有効になっています。アロッカーターなし環境の場合、デフォルトの機能(つまりalloc )をオフにすることができます。これにより、 Vec / String / Cowを返すAPIの一部が利用できなくなります。
電子メールで発生する文字エンコーディングをデコードするには、これを直接使用する代わりにcharset Crateを使用してください。 (このクレートをラップし、UTF-7デコードを追加します。)
Windowsコードページの識別子とのマッピングの場合は、 codepage Crateを使用します。
このクレートは、Webプラットフォームでは必要ない単一バイトのDOSエンコーディングをサポートしていませんが、 oem_cpクレートはそうです。
テキストをユニコード正規化フォームCに正規化する前に、テキストをエンコードする前にエンコードする前に、マップできない文字を最小限に抑えます。テキストは、 icu_normalizer Crateを使用して、CODEの正規化フォームCに正規化できます。
例外はWindows-1258です。これは、Unicode正規化フォームCに正規化した後、マップできない文字を最小限に抑えるためにトーンマークを分解する必要があります。ベトナムのトーンマークは、 detoneを使用して分解できます。
TL; DR :( (Apache-2.0 OR MIT) AND BSD-3-Clause 。
著作権という名前のファイルをご覧ください。
このクレートのWhatWGデータから生成されない非テストコードは、Apache-2.0またはMITの下にあります。テストコードはCC0の下にあります。
このクレートには、WhatWG-Suppliedデータから生成されたコード/データが含まれています。 WhatWG Upstreamは、このクレートの最初のリリースとこのクレートの現在のバージョンの間に、CC0からBSD-3節にソースコードに組み込まれた仕様の一部のライセンスを変更しました。ソース内のライセンスの凡例は、上流のライセンス変更以来変更された生成されたコードの一部に対して更新されています。
生成されたAPIドキュメントはオンラインで入手できます。
木枠のデザインと内部についての長期の記事があります。
Encoding_RS用のFFIレイヤーは、別のクレートとして利用できます。クレートには、C ++標準ライブラリとGSLタイプを使用して、デモC ++ラッパーが付属しています。
memモジュールのバインディングは、encoding_c_memクレートにあります。
Geckoコンテキストでは、MFBT/XPCOMタイプを使用したC ++ラッパーがあります。
C ++ラッパーについての記事があります。
現在、これらのオプションの貨物機能があります。
simd-accel夜間に依存するportable_simd標準ライブラリ機能を使用して、SIMDアクセラレーションを有効にします。
これは、この機能を有効にすることで、将来のコンパイラが古いコードをコンパイルするというRustの保証からオプトアウトされるため、オプトイン機能です。
現在、これはこれらのターゲットを除いて改善とは言われておらず、 simd-accel機能が他のターゲットでビルドを破ることが期待されています。
毎晩のRustを使用する場合、最初のコンポーネントが上記の1つであるターゲットを使用し、 Rustを更新するときに構成を修正する準備ができているため、この機能を有効にする必要があります。それ以外の場合は、この機能を有効にしないでください。
Firefoxが使用します。
serde Serdeを使用して、シリアル化と脱派のサポート&'static Encoding型構造フィールドを有効にします。
Firefoxで使用されていません。
fast-legacy-encode最速のレガシーエンコードオプションを有効にするためのキャッチオプション。デコード速度やUTF-8エンコード速度には影響しません。
現在、このオプションは、次のオプションを有効にすることと同等です。
fast-hangul-encodefast-hanja-encodefast-kanji-encodefast-gb-hanzi-encodefast-big5-hanzi-encodeバイナリサイズに176 kbを追加します。
Firefoxで使用されていません。
fast-hangul-encodeデコードの最適化されたテーブル上のバイナリ検索から、韓国のプレーンテキストをこのオプションなしで約4倍速くエンコードすることにより、デコード最適化テーブル上のバイナリ検索からルックアップへのeuc-krにエクサムをエンコードする変更を変更します。
バイナリサイズに20 kbを追加します。
デコード速度には影響しません。
Firefoxで使用されていません。
fast-hanja-encodeデコード最適化されたテーブル上の線形検索からインデックスごとのルックアップにhanjaをEUC-krにエンコードすることを変更します。 Hanjaは現代の韓国のテキストでは実質的に存在しないため、このオプションは一般的なケースのパフォーマンスに影響を与えず、EUC-KRにエンコードするために多くのHanjaを意図的に提供する人によって、アプリケーションを回復力のあるAgaistサービスの拒否にしたい場合に主に理にかなっています。
バイナリサイズに40 kbを追加します。
デコード速度には影響しません。
Firefoxで使用されていません。
fast-kanji-encode漢字のshift_jis、euc-jp、およびISO-2022-JPへのエンコードの変更デコード最適化テーブル上の線形検索から、日本のプレーンテキストエンコードを30〜50倍にすることにより、インデックスをインデックスにしてルックアップに移行します(このオプションの約2倍のless-slow-kanji-encodeの速度)。
less-slow-kanji-encodeよりも優先されます。
36 kbをバイナリサイズに追加します( less-slow-kanji-encodeと比較して24 kb)。
デコード速度には影響しません。
Firefoxで使用されていません。
less-slow-kanji-encodeJIS X 0208レベル1の漢字(Shift_jis、EUC-JP、ISO-2022-JPの最も一般的な漢字)は、このオプションなしでは日本のプレーンテキストエンコードを14〜23倍速くエンコードします。
バイナリサイズに12 kbを追加します。
デコード速度には影響しません。
Firefoxで使用されていません。
fast-gb-hanzi-encode CJK統一されたアイドラフでのHANZIのエンコーディングの変更は、デコード最適化テーブルの線形検索からGBKおよびGB18030にブロックされ、その後、デコード最適化テーブルの別の部分のバイナリ検索がインデックスを作成してルックアップして、100から100から100までのエンコードに100から、100回まで(2.5回のように、100回まで100個から、100回までのレガーエンコードを作成します。 less-slow-gb-hanzi-encode )。
less-slow-gb-hanzi-encodeよりも優先されます。
36 kbをバイナリサイズに追加します( less-slow-gb-hanzi-encodeと比較して24 kb)。
デコード速度には影響しません。
Firefoxで使用されていません。
less-slow-gb-hanzi-encodeGB2312レベル1のHANZI(GB18030およびGBKで最も一般的な漢字)は、このオプションがなければ、レガシーエンコードの約40倍のレガシーエンコーディングに簡素化された中国のプレーンテキストエンコードを低速にします(線形検索の代わりにバイナリ検索)エンコードをエンコードします。
バイナリサイズに12 kbを追加します。
デコード速度には影響しません。
Firefoxで使用されていません。
fast-big5-hanzi-encode CJK統一されたアイデロググラフにおけるハンジのエンコードの変更は、デコード最適化テーブルの線形検索から、インデックスを使用することでless-slow-big5-hanzi-encodeに移動するBig5にブロックされます。
less-slow-big5-hanzi-encodeよりも優先されます。
バイナリサイズに40 kbを追加します( less-slow-big5-hanzi-encodeと比較して20 kb)。
デコード速度には影響しません。
Firefoxで使用されていません。
less-slow-big5-hanzi-encodeBig5レベル1のHanzi(Big5で最も一般的なHanzi)は、このオプションがなければ、従来の中国のプレーンテキストエンコードをBIG5に約36倍速くすることが少なくなります(リニア検索の代わりにバイナリ検索)エンコードが少なくなります。
バイナリサイズに20 kbを追加します。
デコード速度には影響しません。
Firefoxで使用されていません。
UTF-16へのデコードの場合、目標は少なくともGeckoの古いUCONVと同様に実行することです。 UTF-8へのデコードの場合、目標は少なくとも錆びを実行することです。これらの目標は達成されました。
UTF-8へのエンコードは速いはずです。 (UTF-8からUTF-8エンコードは、 memcpyおよびUTF-16からUTF-8に相当する必要があります。)
レガシーエンコーディングにエンコードすると、スピードはノンゴールです。デフォルトでは、レガシーエンコーディングへのエンコーディングは、ヤモリのフォームの提出とURLの解析が実際の使用であまりにも遅すぎない限り、コードサイズを犠牲にして速度で最適化されるべきではありません。
バイナリサイズのために、デフォルトでは、エンコード_RSには、単一バイトエンコードごとに32ビットのエンコード固有のデータを超えるエンコード固有のデータテーブルがありません。したがって、エンコーダーはデコード最適化されたデータテーブルを検索します。これは、ほとんどの場合、線形検索です。その結果、デフォルトでは、レガシーのエンコードへのエンコードは、他のライブラリと比較して、遅い状態から非常に遅いまでさまざまです。それでも、現実的な作業の負荷があるため、これはWeb露出したエンコーダーユースケースのRaspberry Pi 3(テスト用の電話のために立つ)でユーザーが魅力的に遅くならないほど速く見えました。
オプションでCJKレガシーを高速にするために、上記の貨物機能を参照してください。
パフォーマンスを測定するためのフレームワークは個別に利用できます。
最新の安定した錆、最新の毎晩の錆、そして毎晩Firefoxに使用される錆のバージョンをサポートすることは目標です。
現時点では、Firefoxが必要とするものよりも古いバージョンをサポートするという確固たるコミットメントはありません。MSRVの変化をSemver-breakingとして扱うというコミットメントはありません。このクレートはcfg-ifに依存しているため、MSRVの変化をSemver-Breakingとして扱わないように見えるため、このクレートはSemver-Breakingとして治療することは役に立たないでしょう。
2024-11-01の時点で、MSRVはクレートには錆びた1.40.0であると思われ、Global Allocatorについてのエラーなしに通過するためにDOCテストに1.42.0を使用しています。 simd-accel機能により、MSRVはさらに高くなっています。
エンコーディング_RSの上に錆をコードするAPIを実装する互換性レイヤーは、別のクレートとして提供されます(crates.ioにアップロードすることはできません)。互換性レイヤーはもともと、Firefoxがそれを必要とするという相殺で書かれていましたが、現在Firefoxでは使用されていません。
生成されたコードを再生するには:
https://github.com/hsivonen/encoding_c encoding_rsディレクトリの横にあります。https://github.com/hsivonen/codepage encoding_rsディレクトリの横にあります。https://github.com/whatwg/encoding encoding_rsディレクトリの横にあります。1d519bf8e5555cef64cf3a712485f41cd1a6a990のencodingリポジトリ。 (注: f381389 、 encodingレポライセンス変更の前から使用されたencodingの改訂でした。)encoding_rsディレクトリをワーキングディレクトリとして、 python generate-encoding-data.pyを実行します。 usize u8代わりに使用を処理します)。 allocなしで機能するビルドモードを提供します(API表面が低い)。 std::simdに移行しますu8 / u16よりも大きなタイプでunsafeスライスアクセスをalign_toに移行します。 packed_simd Crateの代わりに、標準ライブラリのportable_simdの毎晩機能を使用します。 simd-accelオプションの夜間機能にのみ影響します。unsafeに関する内部ドキュメントの改善とマイナーなコードの改善。Cargo.tomlにrust-versionを追加しました。packed_simd_2の代わりにpacked_simd使用してください。これにより、更新がpacked_simd名の下に戻ってきました。 simd-accelオプションの夜間機能にのみ影響します。build.rsを削除しました。 (この除去は、いくつかのウイルス対策製品によって報告された誤検知を解決するはずです。これにより、将来のビルドの破損に対する錆の保証をオプトアウトしたビルド構成が破損する可能性があります。)no_stdサポートの一部として導入されたSerdeサポートのエラーを修正します。no_std環境でクレートを動作させます( allocを使用)。simd-accel機能を破った2018年版の移行の監視を修正しました。packed_simd依存関係をpacked_simd_2に更新します。cfg-if依存関係を1.0に更新します。cfg-if 、2018年に更新されます。Decoder::latin1_byte_compatible_up_toは、そのメソッドを実際に便利にするために、それ以上の場合にNoneに戻します。これは、バグ修正のセマンティクスの変化による壊れた変化であると主張することができますが、とにかく合理的な方法でなしケースを処理しなければならNoneた発信者を破ることはありません。convert_str_to_utf16のバインドチェックの束を削除しました。mem::convert_utf8_to_utf16_without_replacementを追加しました。mem::utf8_latin1_up_toとmem::str_latin1_up_toを追加しました。Decoder::latin1_byte_compatible_up_toを追加しました。bincode (DEV依存関係)バージョンの要件を1.0に更新します。simdクレートからpacked_simdに切り替えます。simd-accel (READMEのみのリリース)のドキュメントを調整します。clippy::プレフィックスを削除しました。static定義するときにstaticの内部を参照する機能について)。Encodingに追加されたメソッドis_single_byte() 。mem::decode_latin1()およびmem::encode_latin1_lossy()を追加しました。--features simd-accel Stable-Channelコンパイラと連携してFirefoxビルドシステムを簡素化します。is_foo_bidi()をu+feff(ゼロ幅なしのブレイクスペース、別名バイトオーダーマーク)と左への右に扱わないようにしました。is_foo_bidi()関数は、入力にヘブライ語のプレゼンテーションフォーム(左への右)が含まれている場合にtrueを報告します。convert_utf16_to_latin1_lossyからバージョン0.8.5に追加されたデバッグアサーションを一時的に削除しました。memモジュールのLATIN1への紛失した変換は、入力がU+0000 ... U+00FF(包括的)の範囲にあると主張します。memモジュールでは、不十分な出力スペースに対処できるLATIN1およびUTF-16からUTF-8への変換を提供します。アイデアは、Jemallocバケットサイズに丸められた割り当てで最初にそれらを使用し、Jemallocの丸みが最初の推測として不十分である場合にのみ、最悪の割り当てを行うことです。memモジュールのUTF-16とLATIN1の間の変換でバージョン0.8.1で導入されたSSE2固有のsimd-accel固有のメモリ破損を修正します。#[inline(never)]注釈を削除しました。memモジュールのUTF-16とLATIN1の間のSSE2変換のための微調整されたループの展開とメモリアラインメントは、長いバッファーを変換するときにパフォーマンスを向上させます。memモジュールを追加します。memモジュール以外のパフォーマンスに影響を与える可能性のあるSIMDコードをリファクタリングします。replacement交換エンコードのラベルにします。 (仕様の変更。)Encoding::for_name()を削除します。 ( Encoding::for_label(foo).unwrap()は、上記のラベルが変更された後、十分に近づいています。)parallel-utf8貨物機能を削除します。&'static EncodingのオプションのSerdeサポートを追加します。Encoder::has_pending_state() publicを作成します。simdクレートの依存関係を0.2.0に更新します。7Fを正しくデコードします。EncodingにHashを実装します。OutputFullよりもInputEmptyの正しい優先順位を与え、渡された出力バッファーが短すぎるか、出力バッファーの残りのスペースが交換後に小さすぎます。CoderResult 、 DecoderResult 、およびEncoderResultタイプのPartialEqとEqを導き出します。Encoder::encode_from_utf16の不良インデックスを使用したサブスライシングからのパニックを修正します。 (監視のために、 Encoder::encode_from_utf8既に持っていた修正がありませんでした。)#[must_use]で注釈を付けます。parallel-utf8を使用)。simd-accelを使用すると、UTF-8をUTF-8にデコードします。constからstaticへのEncodingのインスタンスへの参照を変更して、referentsを使用する木枠を越えて指示対象を一意にするようにします。Encodingの非参照型FOO_INITインスタンスを導入して、外国のクレートが&'static Encodingタイプのstaticの統計を備えた&'static Encodingアレイアイテムの初期化を禁止するrustの制約の下でさえ、 Encodingインスタンスへの参照を持つ静的配列を初期化できるようにstatics 。constて機能する場合、上記の2つのポイントが戻ることを文書化します。Cowを返します。Encoding::for_bom() bomの長さを返します。simd-accel機能フラグの後ろにSSE2アクセラレーションを追加します。 (毎晩の錆が必要です。)Encoder.encode_from_utf8_to_vec_without_replacement()を追加します。 Encoding.is_ascii_compatible()を追加します。
Encoding::for_bom()を追加します。
== Encodingの場合は、ポインター比較の代わりに名前の比較を使用します。これは、異なるクレートのエンコード定数の使用が異なるアドレスをもたらし、定数を他のことを壊さずに静的に変えることはできないためです。
最初のリリース。