61次发布
0.8.34 | 2024年4月10日 |
---|---|
0.8.33 | 2023年8月23日 |
0.8.32 | 2023年2月1日 |
0.8.31 | 2022年4月5日 |
0.2.1 | 2016年7月14日 |
在 编码 中排名 #7
5,728,221 次每月下载
用于 13,554 个crate(394直接使用)
3.5MB
133K SLoC
encoding_rs
encoding_rs是用Rust编写的(非JavaScript部分的)编码标准的实现。
编码标准定义了Web兼容的字符编码集,这意味着这个crate可以用来解码Web内容。encoding_rs从Firefox 56开始用于Gecko。由于Web上的传统编码与Windows上使用的传统编码之间的显著重叠,这个crate也可能适用于非Web相关的情况;有关相邻crate的链接,请参见下文。
此外,mem
模块提供了一些操作,用于处理内存中的文本(与来自或发送到IO边界的数据进行区分)。由于内部实现细节的效率,mem
模块是一个模块而不是一个单独的crate。
功能
由于Gecko的使用情况,encoding_rs除了支持将UTF-8解码和编码为UTF-8之外,还支持将UTF-16解码和编码为UTF-16。此外,API已设计为FFI友好,以适应Gecko的C++方面。
具体来说,encoding_rs执行以下操作
- 将一个编码标准定义的字符编码的字节流解码为有效的对齐的内存中UTF-16(以
u16
/char16_t
为单位)。 - 将一个潜在无效的对齐的内存中UTF-16(以
u16
/char16_t
为单位)的字节流编码为一个编码标准定义的字符编码的序列,好像在编码之前将单个代理字符替换为替换字符。 (Gecko的UTF-16可能无效。) - 将一个编码标准定义的字符编码的字节流解码为有效的UTF-8。
- 将有效的UTF-8流编码为按编码标准定义的字符编码序列的字节数据。 (Rust的UTF-8保证是有效的。)
- 以上操作包括流式处理(输入和输出分跨多个缓冲区)和非流式处理(整个输入在一个缓冲区中,整个输出在一个缓冲区中)两种方式。
- 在非流式处理情况下,当解码到UTF-8或从UTF-8编码时,尽可能地避免复制(借用)。
- 将协议文本中标识字符编码的文本标签解析为表示那些编码概念上的类型安全对象。
- 将类型安全的编码对象映射为适合从
document.characterSet
返回的字符串。 - 验证UTF-8(在常见的指令集场景中,对于Web工作负载比标准库快一些;希望有一天能集成到上游)和ASCII。
此外,encoding_rs::mem
还执行以下操作
- 检查字节数据缓冲区是否仅包含ASCII。
- 检查可能无效的UTF-16缓冲区是否仅包含基本拉丁字符(ASCII)。
- 检查有效或可能无效的UTF-8、UTF-8或UTF-16缓冲区是否仅包含Latin1代码点(低于U+0100)。
- 检查有效或可能无效的UTF-8、UTF-8或UTF-16缓冲区、代码点或UTF-16代码单元是否可以触发从右到左的行为(适合检查Unicode双向算法是否可以优化)。
- 上述两个检查的组合版本。
- 将有效的UTF-8、可能无效的UTF-8和Latin1转换为UTF-16。
- 将可能无效的UTF-16和Latin1转换为UTF-8。
- 将UTF-8和UTF-16转换为Latin1(如果在此范围内)。
- 找到可能无效的UTF-16缓冲区中的第一个无效代码单元。
- 使可能无效的UTF-16缓冲区包含有效的UTF-16。
- 将ASCII从另一个缓冲区复制到另一个缓冲区,直到第一个非ASCII字节。
- 将ASCII转换到UTF-16,直到第一个非ASCII字节。
- 将UTF-16转换为ASCII,直到第一个非基本拉丁代码单元。
与 std::io::Read
集成
值得注意的是,上述功能列表不包括将 std::io::Read
封装、解码为UTF-8并通过 std::io::Read
展示结果的能力。 encoding_rs_io
包提供了这项功能。
no_std
环境
该包在 no_std
环境中工作。默认情况下,启用了假定存在分配器的 alloc
功能。对于无分配器环境,可以关闭默认功能(即 alloc
)。这使得API返回的 Vec
/String
/Cow
不可用。
解码电子邮件
对于解码电子邮件中出现的字符编码,请使用 charset
包,而不是直接使用此包。 (它包装此包并添加UTF-7解码。)
Windows代码页标识符映射
对于到和从Windows代码页标识符的映射,请使用 codepage
包。
DOS编码
该包不支持Web平台不需要的单字节DOS编码,但 oem_cp
包支持。
为编码器准备文本
在将文本编码为旧编码之前,将文本归一化为Unicode归一化格式C可以最小化无法映射的字符。可以使用unic-normal
包将文本归一化为Unicode归一化格式C。
例外是windows-1258,在归一化为Unicode归一化格式C后,需要分解声调标记以最小化无法映射的字符。可以使用detone
包分解越南语声调标记。
许可证
TL;DR:代码和数据组合的许可证为(Apache-2.0 OR MIT) AND BSD-3-Clause
。
请参阅名为COPYRIGHT的文件。
此包中非测试代码不是从该包中的WHATWG数据生成的,受Apache-2.0或MIT许可。测试代码受CC0许可。
此包包含从WHATWG提供的数据生成的代码/数据。WHATWG在发布此包的初始版本和当前版本之间更改了包含到源代码中的规范部分的许可证,从CC0更改为BSD-3-Clause。已更新源代码中生成的代码部分的许可证说明。
文档
在线可获取生成的API文档。
有关该包的设计和内部结构的长篇说明。
C和C++绑定
编码_rs的FFI层可作为单独的包使用。该包附带一个C++包装器示例,它使用C++标准库和GSL类型。
mem模块的绑定在encoding_c_mem包中。
对于Gecko上下文,有一个使用MFBT/XPCOM类型的C++包装器。
有关C++包装器的说明。
示例程序
可选功能
目前有以下可选的Cargo功能
simd-accel
启用使用nightly-dependent portable_simd
标准库功能进行的SIMD加速。
这是一个可选功能,因为启用此功能会选择退出Rust对未来编译器编译旧代码的保证(即“稳定性故事”)。
目前,除了以下目标和启用simd-accel
功能之外,没有测试表明这是一个改进。在其他目标上启用simd-accel
功能可能会破坏构建。
- x86_64
- i686
- aarch64
- thumbv7neon
如果您使用nightly Rust,并且您使用的是上述目标的第一个组件,并且您准备在更新Rust时必须修改您的配置,则应启用此功能。否则,请不要启用此功能。
由Firefox使用。
serde
启用使用Serde对&'static Encoding
类型字段进行序列化和反序列化的支持。
不被Firefox使用。
fast-legacy-encode
启用最快旧版编码选项的全局选项。不会影响解码速度或UTF-8编码速度。
目前,此选项等同于启用以下选项
fast-hangul-encode
fast-hanja-encode
fast-kanji-encode
fast-gb-hanzi-encode
fast-big5-hanzi-encode
增加176 KB的二进制文件大小。
不被Firefox使用。
fast-hangul-encode
将预组合的韩文字符编码从EUC-KR的二进制搜索解码优化表转换为索引查找,使韩文纯文本编码比不使用此选项快约4倍。
增加20 KB的二进制文件大小。
不会影响解码速度。
不被Firefox使用。
fast-hanja-encode
将汉字编码从EUC-KR的线性搜索解码优化表转换为索引查找。由于现代韩文中汉字实际上很少见,此选项在常见情况下不会影响性能,主要用于您希望使您的应用程序能够抵御某人故意向其输入大量汉字进行EUC-KR编码的拒绝服务攻击时。
增加40 KB的二进制文件大小。
不会影响解码速度。
不被Firefox使用。
fast-kanji-encode
将汉字编码从Shift_JIS、EUC-JP和ISO-2022-JP的线性搜索解码优化表转换为索引查找,使日文纯文本编码到旧版编码的速度比不使用此选项快30至50倍(约比使用less-slow-kanji-encode
快2倍)。
比less-slow-kanji-encode
具有优先级。
增加36 KB的二进制文件大小(比less-slow-kanji-encode
多24 KB)。
不会影响解码速度。
不被Firefox使用。
less-slow-kanji-encode
将JIS X 0208 Level 1汉字(Shift_JIS、EUC-JP和ISO-2022-JP中最常见的汉字)的编码速度减慢(二进制搜索代替线性搜索),使日文纯文本编码到旧版编码的速度比不使用此选项快14至23倍。
增加12 KB的二进制文件大小。
不会影响解码速度。
不被Firefox使用。
fast-gb-hanzi-encode
将CJK统一表意文字块中的汉字编码从GBK和gb18030的线性搜索解码优化表的一部分转换为索引查找,将简体中文纯文本编码到旧版编码的速度比不使用此选项快100至110倍(约比使用less-slow-gb-hanzi-encode
快2.5倍)。
比less-slow-gb-hanzi-encode
具有优先级。
增加36 KB的二进制文件大小(比less-slow-gb-hanzi-encode
多24 KB)。
不会影响解码速度。
不被Firefox使用。
less-slow-gb-hanzi-encode
将GBK 2312 Level 1汉字(gb18030和GBK中最常见的汉字)编码速度减慢(二进制搜索代替线性搜索),使简体中文纯文本编码到旧版编码的速度比不使用此选项快约40倍。
增加12 KB的二进制文件大小。
不会影响解码速度。
不被Firefox使用。
fast-big5-hanzi-encode
将CJK统一表意文字块中的汉字编码从GBK和gb18030的线性搜索解码优化表的一部分转换为索引查找,将繁体中文纯文本编码到Big5的速度比不使用此选项快105至125倍(约比使用less-slow-big5-hanzi-encode
快3倍)。
比less-slow-big5-hanzi-encode
具有优先级。
增加40 KB的二进制文件大小(比less-slow-big5-hanzi-encode
多20 KB)。
不会影响解码速度。
不被Firefox使用。
less-slow-big5-hanzi-encode
将Big5 Level 1汉字(Big5中最常见的汉字)编码速度减慢(二进制搜索代替线性搜索),使繁体中文纯文本编码到Big5的速度比不使用此选项快约36倍。
增加20 KB的二进制文件大小。
不会影响解码速度。
不被Firefox使用。
性能目标
对于解码到UTF-16,目标是至少与Gecko的旧uconv一样好。对于解码到UTF-8,目标是至少与rust-encoding一样好。这些目标已经实现。
UTF-8编码应该快速。(UTF-8到UTF-8编码应该等同于memcpy
,UTF-16到UTF-8也应该快速。)
在将数据编码为旧版编码格式时,速度不是目标。默认情况下,只要在Gecko中表单提交和URL解析在现实使用中不会变得明显缓慢,就不应该以代码大小为代价优化旧版编码格式的速度。
为了二进制大小,默认情况下,encoding_rs没有超过每个单字节编码32位编码特定数据的编码特定数据表。因此,编码器会搜索解码优化的数据表。在大多数情况下,这是一个线性搜索。因此,默认情况下,将数据编码为旧版编码格式的速度与其他库相比从慢到极慢。然而,在实际工作负载下,这似乎足够快,不会在Raspberry Pi 3(作为测试用手机)的Web暴露编码器用例中变得用户可见地缓慢。
有关可选使CJK旧版编码快速的方法,请参见上面的cargo功能。
性能测量框架可供单独使用。
Rust版本兼容性
目标是支持最新的稳定版Rust、最新的夜间版Rust以及用于Firefox Nightly的Rust版本。
目前,没有承诺支持低于Firefox所需版本的版本,也没有承诺将MSRV更改视为semver-breaking,因为此crate依赖于cfg-if
,它似乎不会将MSRV更改视为semver-breaking,因此对于此crate而言,将MSRV更改视为semver-breaking将毫无意义。
截至2024-04-04,MSRV似乎是用于crate的Rust 1.36.0以及用于通过doc测试通过而不出现关于全局分配器错误的Rust 1.42.0。使用simd-accel
功能,MSRV更高。
与rust-encoding的兼容性
一个在encoding_rs之上实现rust-encoding API的兼容层作为单独的crate提供(不能上传到crates.io)。兼容层最初是为了假设Firefox会需要它而编写的,但目前在Firefox中并未使用。
重新生成生成代码
要重新生成生成代码
- 请安装Python 2。
- 在
encoding_rs
目录旁边克隆https://github.com/hsivonen/encoding_c
。 - 在
encoding_rs
目录旁边克隆https://github.com/hsivonen/codepage
。 - 在
encoding_rs
目录旁边克隆https://github.com/whatwg/encoding
。 - 检出
encoding
仓库的修订版本be3337450e7df1c49dca7872153c4c4670dd8256
。(注意:f381389
是encoding
仓库在许可变更之前使用的修订版本。到目前为止,自那时以来只有输出的更改已更新到新的许可说明。) - 将
encoding_rs
目录作为工作目录,运行python generate-encoding-data.py
。
路线图
- 设计低级API。
- 提供仅Rust的便利功能。
- 提供一个具有stl/gsl风格的C++ API。
- 实现所有解码器和编码器。
- 为所有解码器和编码器添加单元测试。
- 在仅Rust的便利功能中完成BOM嗅探变体的工作。
- 记录API。
- 在crates.io上发布crate。
- 创建一个用于测量性能的解决方案。
- 在x86上使用SSE2加速ASCII转换。
- 在非x86架构上使用ALU寄存器大小的操作加速ASCII转换(一次处理一个
usize
而不是u8
)。 - 将FFI拆分为单独的crate,以便FFI不会干扰纯Rust使用中的LTO。
- 通过使用序列代码点和索引的Unicode排序部分来压缩CJK索引。
- 通过从标签/名称的末尾开始搜索到开始的方式使用二分搜索来执行标签或名称的查找。
- 快速失败处理非ASCII字节的标签。
-
使用Rayon并行化UTF-8验证。(由于内存带宽原因,这在ASCII情况下表现不佳。) - 提供XPCOM/MFBT风格的C++ API。
- 调查使用每个编码的单个快速跟踪范围来加速单字节编码。
- 在Gecko中将uconv替换为encoding_rs。
- 在encoding_rs的基础上实现rust-encoding API。
- 为Aarch64添加SIMD加速。
- 调查32位ARM上使用NEON的情况。
-
调查Björn Höhrmann的UTF-8查找表加速,该加速在rust-encoding中针对Rust进行了适配。 - 添加实际的快速CJK编码选项。
-
调查Bob Steagall的UTF-8查找表加速。 - 提供一个无需
alloc
(具有较小的API界面)的构建模式。 - 迁移到
std::simd
(一旦稳定并宣布1.0)。 - 将大于
u8
/u16
的大类型unsafe
切片访问迁移到align_to
。
发行说明
0.8.34
- 使用标准库的
portable_simd
夜间功能,而不是packed_simd
存储库。仅影响simd-accel
可选夜间功能。 - 改进内部文档和有关
unsafe
的轻微代码改进。 - 将
rust-version
添加到Cargo.toml
。
0.8.33
- 现在由于更新再次返回
packed_simd
名称下,使用packed_simd
而不是packed_simd_2
。仅影响simd-accel
可选夜间功能。
0.8.32
- 删除了
build.rs
。(此删除应解决某些防病毒产品报告的假阳性。这可能会破坏选择退出Rust对未来构建破坏保证的一些构建配置。) - 对用于重新解释SIMD向量通道配置的API进行内部更改。
- 改进文档。
0.8.31
- 现在crates.io支持括号后,使用SPDX带括号。
0.8.30
- 更新许可信息,以考虑WHATWG数据许可变更。
0.8.29
- 使使用分配器的部分可选。
0.8.28
- 修复了作为
no_std
支持引入的Serde支持中的错误。
0.8.27
- 使存储库在
no_std
环境中工作(具有alloc
)。
0.8.26
- 修复了2018版迁移中的疏忽,这破坏了
simd-accel
功能。
0.8.25
- 在计算指针对齐时,以中间步骤未定义为未定义行为的方式进行指针对齐检查。
- 将
packed_simd
依赖项更新到packed_simd_2
。 - 将
cfg-if
依赖项更新到1.0。 - 解决由于较新的Rust版本引入的警告。
- 升级到2018版,因为即使是在1.0之前,
cfg-if
也更新到2018版,没有semver中断。
0.8.24
- 在计算指针对齐时,避免以指定为未定义行为的方式进行中间(非解引用)指针值计算。
0.8.23
- 从版权通知中删除年份。(没有新功能或错误修复。)
0.8.22
- 格式修复和新单元测试。(没有新功能或错误修复。)
0.8.21
- 修复了在流末尾无效UTF-16[BE|LE]输入导致的panic。
0.8.20
- 使
Decoder::latin1_byte_compatible_up_to
在更多情况下返回None
,使该方法真正有用。虽然这可能会因为修复错误而改变语义而被认为是破坏性更改,但无论如何,它不会破坏必须以合理方式处理None
情况的调用者。
0.8.19
- 从
convert_str_to_utf16
中移除了一些边界检查。 - 添加了
mem::convert_utf8_to_utf16_without_replacement
。
0.8.18
- 添加了
mem::utf8_latin1_up_to
和mem::str_latin1_up_to
。 - 添加了
Decoder::latin1_byte_compatible_up_to
。
0.8.17
- 将
bincode
(开发依赖项)的版本要求更新到 1.0。
0.8.16
- 从
simd
包切换到packed_simd
。
0.8.15
- 调整了
simd-accel
的文档(仅 README 版本)。
0.8.14
- 使 UTF-16 到 UTF-8 编码转换尽可能填满输出缓冲区。
0.8.13
- UTF-8 到 UTF-16 解码器比较写入的代码单元数与右侧切片(输出切片)的长度,以修复 0.8.11 中引入的恐慌。
0.8.12
- 从 clippy lint 名称中移除了
clippy::
前缀。
0.8.11
- 将最低 Rust 要求更改为 1.29.0(在定义另一个
static
时,能够引用static
的内部)。 - 显式地对单字节编码和 UTF-8 的查找表进行了对齐,希望为其他数据释放一个缓存行。(也许表已经对齐了,这只是安慰剂。)
- 为每个单字节编码添加了 32 位编码方向数据。对于非拉丁1型拉丁传统编码,该更改对性能没有影响,略微提高了拉丁1型和中东编码的速度(德国速度提高了 2.4 倍,阿拉伯语提高了 2.3 倍,葡萄牙语提高了 1.7 倍,法语提高了 1.4 倍),并大幅提高了非拉丁1型、非阿拉伯传统单字节编码(泰语提高了 7.2 倍,希腊语提高了 6 倍,俄语提高了 5 倍,希伯来语提高了 4 倍)。
- 添加了编译时选项,用于快速 CJK 传统编码选项(以二进制大小(高达 176 KB)和运行时内存使用为代价)。这些选项仍然保留了整体代码结构,而不是完全重写 CJK 编码器,因此速度不如使用更多内存/使二进制文件更长所能达到的速度。
- 使 UTF-8 解码和验证更快。
- 在
Encoding
上添加了方法is_single_byte()
。 - 添加了
mem::decode_latin1()
和mem::encode_latin1_lossy()
。
0.8.10
- 禁用了一个单元测试,该测试在测试断言被禁用时测试恐慌条件。
0.8.9
- 使
--features simd-accel
与稳定渠道编译器一起工作,以简化 Firefox 构建系统。
0.8.8
- 使
is_foo_bidi()
不将 U+FEFF(零宽不换行空间,即字节顺序标记)视为从右到左。 - 将
is_foo_bidi()
函数的返回值设置为true
,如果输入包含希伯来语展示形式(这些形式是自右向左的,但不在右向左规划块中)。
0.8.7
- 修复了在将UTF-16LE/UTF-16BE解码为UTF-8时出现的panic。
0.8.6
- 临时移除了在版本0.8.5中添加到
convert_utf16_to_latin1_lossy
的调试断言。
0.8.5
- 如果启用了调试断言但未启用模糊测试,则
mem
模块中的损失性转换为Latin1将断言输入在范围U+0000...U+00FF(含)内。 - 在
mem
模块中提供从Latin1和UTF-16到UTF-8的转换,可以处理输出空间不足的情况。思路是首先使用它们与分配到jemalloc桶大小的分配结合使用,只有在jemalloc四舍五入不足作为第一次猜测时才进行最坏情况的分配。
0.8.4
- 修复了在
mem
模块中引入的UTF-16和Latin1之间的转换中由版本0.8.1引入的特定于SSE2的、simd-accel
特定的内存损坏。
0.8.3
- 移除了一个不应用于发布的
#[inline(never)]
注解。
0.8.2
- 通过手动省略边界检查并手动添加分支预测注释,使非ASCII UTF-16到UTF-8编码更快。
0.8.1
- 调整了
mem
模块中UTF-16和Latin1之间的SSE2转换的循环展开和内存对齐,以提高转换长缓冲区时的性能。
0.8.0
- 将Rust的最低支持版本更改为1.21.0(semver breaking change)。
- 调整了控制Kanji和Hanzi传统编码大小与速度权衡的默认值与可选功能的默认值(semver breaking change)。
- 在ARMv7上添加了NEON支持。
- 实现特定于SIMD的x-user-defined到UTF-16解码。
- 将UTF-16LE和UTF-16BE解码的速度大大提高(包括SIMD加速)。
0.7.2
- 添加了
mem
模块。 - 重构了可能会影响
mem
模块外性能的SIMD代码。
0.7.1
- 在从无效的UTF-16编码时,正确处理U+DC00后面跟另一个低代理符的情况。
0.7.0
- 将
replacement
设置为替换编码的标签。(规范变更。) - 移除了
Encoding::for_name()
。现在在上述标签更改之后,Encoding::for_label(foo).unwrap()
已经足够接近了。 - 移除了
parallel-utf8
cargo功能。 - 为
&'static Encoding
添加了可选的Serde支持。 - 针对ASCII处理的性能调整。
- 针对UTF-8验证的性能调整。
- aarch64上的SIMD支持。
0.6.11
- 使
Encoder::has_pending_state()
公开。 - 将
simd
依赖项更新到0.2.0。
0.6.10
- 在将编码到ISO-2022-JP时为NCR保留足够的空间。
- 纠正多字节解码器的最大长度计算。
- 在执行BOM嗅探之前纠正最大长度计算。
- 在从UTF-16编码为GBK时正确计算最大长度。
0.6.9
- 当gb18030范围解码失败时不添加任何内容。(规范变更。)
0.6.8
- 正确处理第一个缓冲区可能包含部分BOM而下一个缓冲区是最后一个缓冲区的情况。
- 在ISO-2022-JP中正确解码字节
7F
。 - 将UTF-16编码转换为UTF-8编码时,将写入操作移至缓冲区末尾附近。
- 为
Encoding
实现Hash
。
0.6.7
- 在ISO-2022-JP编码器中将半角片假名映射为全角片假名。(规范变更。)
- 在替换编码时,如果输出缓冲区太短或者替换后剩余空间过小,应将
InputEmpty
的正确优先级高于OutputFull
。
0.6.6
- 当部分BOM前缀是解码器的状态的一部分时,纠正最大长度计算。
0.6.5
- 在多个编码器中纠正最大长度计算。
- 在UTF-16解码器中纠正最大长度计算。
- 为
CoderResult
、DecoderResult
和EncoderResult
类型推导PartialEq
和Eq
。
0.6.4
- 在替换编码时,如果目标缓冲区太短无法容纳一个数字字符引用,避免panic。
0.6.3
- 添加对32位大端主机的支持。(这次真的是。)
0.6.2
- 修复在
Encoder::encode_from_utf16
中使用错误索引进行子切片时产生的panic。(由于疏忽,它缺少了Encoder::encode_from_utf8
已经拥有的修复。) - 在非流式传输情况下微优化错误状态累积。
0.6.1
- 在不太可能真正发生的情况下避免整数溢出时的panic。
- 处理Clippy的lints。
0.6.0
- 计算最坏情况缓冲区大小要求的方法应检查整数溢出。
- 升级rayon到0.7.0。
0.5.1
- 重新排序方法以改善文档可读性。
- 添加对大端主机的支持。(实际上仅测试了64位。)
- 优化32位ARM(而非x86_64)的ALU(非SIMD)案例。
0.5.0
- 在非流式解码中避免分配过长的缓冲区。
- 修复ISO-2022-JP和替换解码器在输出缓冲区末尾附近的行为。
- 使用
#[must_use]
注释结果结构。
0.4.0
- 将FFI拆分为单独的crate。
- 性能微调。
- CJK二进制大小和编码性能变化。
- 在长缓冲区的情况下并行化UTF-8验证(使用可选功能
parallel-utf8
)。 - 尽可能使用ISO-2022-JP进行借用。
0.3.2
- 修复基于ALU的ASCII加速中指针移动到对齐的错误。
- 修复文档中的错误并改进文档。
0.3.1
- 修复以0xEE开头的字节序列的UTF-8到UTF-16解码。
- 当使用
simd-accel
功能时,使UTF-8到UTF-8解码SSE2加速。 - 当使用非流式API从ASCII兼容编码解码或编码纯ASCII输入时,返回输入的借用。
- 使从UTF-16到UTF-8的编码更快。
0.3
- 将
Encoding
实例的引用从const
更改为static
,以使引用在引用crates之间是唯一的。 - 引入非引用类型的
FOO_INIT
实例的Encoding
,以允许外部crate在Rust的限制下初始化static
数组,即使这些限制禁止使用&'static Encoding
-类型的数组项初始化&'static Encoding
-类型的静态项。 - 如果Rust将
const
改为使跨crate使用保持引用唯一,则上述两点将恢复。 - 从仅Rust的非流式方法返回
Cow
用于编码和解码。 Encoding::for_bom()
返回BOM的长度。- 除了UTF-16LE、UTF-16BE、ISO-2022-JP和x-user-defined之外的编码的ASCII加速转换。
- 在
simd-accel
功能标志后面添加SSE2加速。(需要nightly Rust。) - 修复长伪标签引起的panic。
- 将windows-1255中的0xCA映射到U+05BA。(规范变更。)
- 修正Shift_JIS EUDC范围的结束。(规范变更。)
0.2.4
- 完善FFI文档。
0.2.3
- 修复UTF-16到UTF-8编码。
0.2.2
- 添加
Encoder.encode_from_utf8_to_vec_without_replacement()
。
0.2.1
-
添加
Encoding.is_ascii_compatible()
。 -
添加
Encoding::for_bom()
。 -
因为不同crate中编码常量的使用会导致不同的地址,并且无法在不破坏其他事物的情况下将常量转换为静态,所以让
==
对于Encoding
使用名称比较而不是指针比较。
0.2.0
首次发布。