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使用名称比较而不是指针比较,因为在不同板条箱中编码常数的使用会导致不同的地址,并且如果不破坏其他事物,常数不能变成静态。
初始版本。