6 个版本
0.4.2 | 2023 年 12 月 3 日 |
---|---|
0.4.1 | 2023 年 12 月 2 日 |
0.3.2 | 2023 年 11 月 28 日 |
0.2.1 |
|
0.1.2 |
|
#309 in 国际化 (i18n)
每月 105 次下载
110KB
2K SLoC
encoding_rs_rw
为 encoding_rs 提供高效的 std::io::{Read, Write} 包装器
该包为 std::io::Read
和 std::io::Write
提供了实现,分别对应于 encoding_rs::Decoder
和 encoding_rs::Encoder
,以支持 Rust 的标准流式 API。
use std::{fs, io, io::prelude::*};
use encoding_rs::{EUC_JP, SHIFT_JIS};
use encoding_rs_rw::{DecodingReader, EncodingWriter};
let file_r = io::BufReader::new(fs::File::open("foo.txt")?);
let mut reader = DecodingReader::new(file_r, EUC_JP.new_decoder());
let mut utf8 = String::new();
reader.read_to_string(&mut utf8)?;
let file_w = fs::File::create("bar.txt")?;
let mut writer = EncodingWriter::new(file_w, SHIFT_JIS.new_encoder());
write!(writer, "{}", utf8)?;
writer.flush()?;
此包是 encoding_rs_io
的替代品,但提供了更简单的 API 和更灵活的错误语义。
该包还提供了一个 lossy
解码读取器的变体,它将无效的字节序列替换为替换字符(U+FFED),以及一个 with_unmappable_handler
写入器变体,它使用指定的处理器处理不可映射的字符。
use std::{fs, io, io::prelude::*};
use encoding_rs::{EUC_KR, ISO_8859_7};
use encoding_rs_rw::{DecodingReader, EncodingWriter};
let file_r = io::BufReader::new(fs::File::open("baz.txt")?);
let mut reader = DecodingReader::new(file_r, EUC_KR.new_decoder());
let mut utf8 = String::new();
reader.lossy().read_to_string(&mut utf8)?;
let file_w = fs::File::create("qux.txt")?;
let mut writer = EncodingWriter::new(file_w, ISO_8859_7.new_encoder());
{
let mut writer =
writer.with_unmappable_handler(|e, w| write!(w, "&#{};", u32::from(e.value())));
write!(writer, "{}", utf8)?;
writer.flush()?;
}
设计
不同字符编码之间的转换本质上需要在转换器前后使用字节缓冲区来实现 Rust 的 Read
和 Write
特性,因为虽然 read
和 write
必须支持按字节操作,但字符编码器和解码器一次处理多个字节以处理多字节字符。该包中的类型使用小的缓冲区进行按字节操作,但尽可能绕过内部缓冲区并使用提供的缓冲区,以最大限度地减少双缓冲和内存消耗。
许可证
根据 Apache 许可证第 2 版许可。
另请参阅
依赖项
~3MB
~118K SLoC