ENCODING_RS實現了用Rust編寫的編碼標準的(非JavaScript部分)。
編碼標准定義了與Web兼容的字符編碼集,這意味著該板條箱可用於解碼Web內容。 Encoding_rs從Firefox 56開始用於Gecko。由於網絡上的舊版編碼與Windows上使用的舊版編碼之間的顯著重疊,因此該板條箱也可能用於與Web相關的情況。有關相鄰板條箱的鏈接,請參見下文。
此外, mem模塊還提供了處理RAM內部文本的各種操作(與來自或進入IO邊界的數據相反)。由於內部實現詳細信息效率, mem模塊是一個模塊,而不是單獨的板條箱。
由於壁虎用例,Encoding_RS支持對UTF-16的解碼和編碼,此外還支持了從UTF-8解碼和編碼的常規RUST用例。此外,API已設計為FFI友好型,以適應壁虎的C ++側。
具體來說,Encoding_rs執行以下操作:
u16 / char16_t的單位)。u16 / char16_t的單位)的流流中的字節序列,在執行Encode之前用更換字符替換了孤獨的代理,就好像孤獨的代理人一樣被替換。 (壁虎的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功能已啟用。對於無藥物環境,可以關閉默認功能(IE alloc )。這使得不可用的API的一部分返回Vec / String / Cow 。
對於在電子郵件中發生的解碼字符編碼,請使用charset板條箱而不是直接使用該板箱。 (它包裹了此板條箱並添加了UTF-7解碼。)
對於訪問Windows代碼頁標識符的映射,請使用codepage Crate。
該板條箱不支持Web平台不需要的單個字節DOS編碼,但是oem_cp板條箱可以。
在將文本編碼為編碼遺產的編碼之前,將文本標準化為c notialation contrication formage formacy formage。可以使用icu_normalizer板條板將文本歸一化為Unicode歸一化表格。
Windows-1258的例外是,在標準化到Unicode歸一化後,C需要分解音調以最大程度地減少無法實現的字符。越南語調標記可以使用detone板條箱分解。
tl; dr :( (Apache-2.0 OR MIT) AND BSD-3-Clause用於代碼和數據組合。
請參閱名為版權的文件。
該板條箱中未從WATWG數據生成的非測試代碼在Apache-2.0或MIT下。測試代碼在CC0下。
該板條箱包含從WhatWG供plied數據生成的代碼/數據。 Whatwg上游將其用於源代碼中的規格部分的許可從CC0納入源代碼,並在此板條箱的初始版本和此板條箱的當前版本之間從CC0到BSD-3-cause。自上游許可更改以來,已更改了生成代碼的部分已更新了源源許可傳奇。
生成的API文檔可在線獲得。
關於板條箱的設計和內部有一個長期的文章。
用於Encoding_RS的FFI層可作為單獨的板條箱獲得。板條箱配有使用C ++標準庫和GSL類型的演示C ++包裝器。
mem模塊的綁定在Encoding_C_MEM板條箱中。
對於壁虎上下文,使用MFBT/XPCOM類型有一個C ++包裝器。
有關於C ++包裝器的文章。
當前有這些可選的貨物功能:
simd-accel使用夜間依賴的portable_simd標準庫功能啟用SIMD加速度。
這是一個選擇加入功能,因為啟用此功能可以選擇Rust的保證將來編譯器編譯舊代碼(又稱“穩定性故事”)。
目前,除了這些目標外,這尚未進行改進,並啟用simd-accel功能有望破壞其他目標的構建:
如果您使用夜間生鏽,則使用其第一個組件是上述目標的目標,並且準備在更新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倍,而沒有此選項。
二進制尺寸增加了20 kb。
不影響解碼速度。
不被Firefox使用。
fast-hanja-encode將hanja編碼到EUC-KR中的編碼從解碼優化的表上的線性搜索到索引查找。由於現代韓國文本實際上缺乏hanja,因此在常見情況下,此選項不會影響灌注,並且如果您想通過有意將其大量的Hanja編碼為EUC-KR來使您的應用程序有彈性的Agaist拒絕服務。
二進制尺寸增加40 kb。
不影響解碼速度。
不被Firefox使用。
fast-kanji-encode將漢字編碼為shift_jis,euc-jp和iso-2022-JP的更改從在解碼優化的表上的線性搜索到通過索引來查找的線性搜索,從而使日本普通文本編碼為遺產編碼30至50倍,而沒有此選項的速度(大約是less-slow-kanji-encode )。
優先於less-slow-kanji-encode 。
將二進制尺寸增加36 kb(與less-slow-kanji-encode相比,24 kb)。
不影響解碼速度。
不被Firefox使用。
less-slow-kanji-encode使JIS X 0208級別1漢字(shift_jis中最常見的漢字,euc-jp和iso-2022-jp)編碼較低的速度較低(二進制搜索而不是線性搜索),使日本普通文本編碼為遺產編碼為14至23倍的遺產編碼,而沒有此選項。
將二進制尺寸增加12 kb。
不影響解碼速度。
不被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 )。
優先於less-slow-gb-hanzi-encode 。
二進制尺寸(與less-slow-gb-hanzi-encode相比)增加了36 KB(24 KB)。
不影響解碼速度。
不被Firefox使用。
less-slow-gb-hanzi-encode使GB2312 Hanzi(GB18030中最常見的Hanzi和GBK中最常見的hanzi)編碼較低的慢(二進制搜索而不是線性搜索),使簡化的中文普通文本編碼編碼為遺產編碼,大約40倍,大約40倍,而沒有此選項。
將二進制尺寸增加12 kb。
不影響解碼速度。
不被Firefox使用。
fast-big5-hanzi-encode CJK統一意識形圖中hanzi編碼編碼的變化從線性搜索從一部分上的線性搜索中擋到BIG5中,以通過索引來查找,從而索引傳統的中國中國普通文本編碼為Big5 105至125倍,而沒有此選項的速度(大約3倍,其快速降低了3倍,其less-slow-big5-hanzi-encode )。
優先優先於less-slow-big5-hanzi-encode 。
二進制尺寸(與less-slow-big5-hanzi-encode相比)增加了40 kb(20 kb)。
不影響解碼速度。
不被Firefox使用。
less-slow-big5-hanzi-encode使Big5級別1 Hanzi(Big5中最常見的hanzi)編碼較低的速度(二進制搜索而不是線性搜索),使傳統的中文普通文本編碼為BIG5,大約是沒有此選項的36倍。
二進制尺寸增加了20 kb。
不影響解碼速度。
不被Firefox使用。
為了解碼UTF-16,目標是至少和壁虎的舊UCONV一樣。為了解碼UTF-8,目標是至少進行製定的編碼。這些目標已經實現。
編碼到UTF-8應該很快。 (UTF-8到UTF-8編碼應等於memcpy ,而UTF-16到UTF-8應該很快。)
速度是非目標編碼到舊版編碼時。默認情況下,只要gecko中的形式提交和URL解析在現實世界中,編碼為代碼大小,就不應以代碼大小為代價進行編碼以代碼大小來優化速度。
為了二進制大小的利益,默認情況下,Encoding_RS沒有針對每個單字節編碼的32位編碼特定數據的編碼特定數據表。因此,編碼器搜索解碼優化的數據表。在大多數情況下,這是線性搜索。結果,默認情況下,編碼為舊版編碼的範圍從相對於其他庫的慢速到極慢。儘管如此,隨著現實的工作負載,這似乎足夠快,以至於在網絡暴露的編碼器用例中,在Raspberry Pi 3上的用戶可視化速度(用於測試的手機)。
請參閱上面的貨物功能,以獲取快速使CJK Legacy編碼。
分別提供了一個測量性能的框架。
它的目標是支持最新的穩定生鏽,最新的夜間生鏽和每晚用於Firefox的Rust版本。
目前,尚無堅定的承諾支持比Firefox要求的版本更古老的版本,也沒有承諾將MSRV變化視為semver的破壞,因為該板條箱依賴於cfg-if ,這似乎並沒有將MSRV變化作為SEMVER的變化,因此將MSRV處理為SEMVERV的變化是無用的。
截至2024-11-01,MSRV似乎是生鏽的1.40.0,用於使用板條箱,而對於DOC測試進行了1.42.0,以通過而沒有關於全局分配器的錯誤。使用simd-accel功能,MSRV甚至更高。
提供了一個在Encoding_rs頂部實現Rust-noting 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目錄為工作目錄,Run python generate-encoding-data.py data.py。 usize而不是u8 )。 alloc的構建模式(具有較小的API表面)。 std::simdu8 / u16遷移unsafe切片訪問到align_to 。 portable_simd夜間功能,而不是packed_simd Crate。僅影響simd-accel可選的每晚功能。unsafe次要代碼改進。Cargo.toml rust-version 。packed_simd而不是packed_simd_2 ,現在更新又返回packed_simd名稱。僅影響simd-accel可選的每晚功能。build.rs 。 (此刪除應解決某些防病毒產品報告的假陽性。這可能會破壞某些構建配置,這些配置選擇了Rust的保證,以防止未來的構建破裂。)no_std支持的一部分引入的SERDE支持中的錯誤。no_std環境(帶有alloc )中工作。simd-accel功能。packed_simd依賴項更新為packed_simd_2 。cfg-if依賴項更新為1.0。cfg-if無需SEMVER中斷。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的文檔(僅讀書版)。clippy::前綴。static時引用static內部的能力)。Encoding上的方法is_single_byte() 。mem::decode_latin1()和mem::encode_latin1_lossy() 。--features simd-accel與穩定通道編譯器一起使用,以簡化Firefox構建系統。is_foo_bidi()不將U+FEFF(零寬度空間aka。字節訂單標記)視為左側。is_foo_bidi()函數報告為true如果輸入包含希伯來語演示表格(左右左右,但在左圖映射的塊中不在權利)。convert_utf16_to_latin1_lossy中添加的0.8.5中添加的調試斷言。mem模塊中向Latin1轉換為LATIN1,斷言輸入在U+0000 ... U+00FF範圍內(包含)。mem模塊中,將LATIN1和UTF-16轉換為UTF-8,可以處理不足的輸出空間。這個想法是首先使用它們的分配,直至Jemalloc桶大小,並且只有在Jemalloc Founding不足的情況下,只有第一個猜測就不足以進行最差的分配。simd-accel在mem模塊中UTF-16和LATIN1之間的轉換中引入的0.8.1中引入的特定內存損壞。#[inline(never)]註釋。mem模塊中UTF-16和LATIN1之間的SSE2轉換的調整循環展開和內存對齊,以在轉換長緩衝區時提高性能。mem模塊。mem模塊之外的性能。replacement為替換編碼的標籤。 (規格更改。)Encoding::for_name() 。 ( Encoding::for_label(foo).unwrap()現在在上述標籤更改後足夠接近。)parallel-utf8貨物功能。&'static Encoding的可選SERDE支持。Encoder::has_pending_state()公開。simd板條箱依賴性更新為0.2.0。7F 。Hash用於Encoding 。InputEmpty正確OutputFull級,而傳遞的輸出緩衝區太短,替換後輸出緩衝區中的剩餘空間太小。CoderResult , DecoderResult和EncoderResult類型提供PartialEq和Eq 。Encoder::encode_from_utf16中的不良索引下列。 (由於疏忽,它缺乏已經具有Encoder::encode_from_utf8的修復程序。)#[must_use]註釋結果結構。parallel-utf8 ),並行化UTF-8驗證。simd-accel時,將UTF-8到UTF-8解碼SSE2加速器。const到static Encoding的實例的引用,以使使用參考的板條箱中的參考物具有獨特性。Encoding非參考類型的FOO_INIT實例,以允許外國板條箱初始化static陣列,即使在Rust的約束下,也可以用&'static Encoding Encoding數組項目的初始化使用&'static Encoding靜態靜態statics進行編碼。const工作,以使參考物保持獨特之處。Cow 。Encoding::for_bom()返回BOM的長度。simd-accel功能標誌後面添加SSE2加速度。 (需要每晚生鏽。)Encoder.encode_from_utf8_to_vec_without_replacement() 。添加Encoding.is_ascii_compatible() 。
添加Encoding::for_bom() 。
Make ==用於Encoding使用名稱比較而不是指針比較,因為在不同板條箱中編碼常數的使用會導致不同的地址,並且如果不破壞其他事物,常數不能變成靜態。
初始版本。