#字符编码 #读写 #IO读取 #IO写入 #IO #编解码器

encoding_rs_rw

为 encoding_rs 提供高效的 std::io::{Read, Write} 包装器

6 个版本

0.4.2 2023 年 12 月 3 日
0.4.1 2023 年 12 月 2 日
0.3.2 2023 年 11 月 28 日
0.2.1 2023 年 11 月 11 日
0.1.2 2023 年 11 月 8 日

#309 in 国际化 (i18n)

Download history 38/week @ 2024-03-28 37/week @ 2024-04-04

每月 105 次下载

Apache-2.0

110KB
2K SLoC

encoding_rs_rw

Crates.io License

为 encoding_rs 提供高效的 std::io::{Read, Write} 包装器

该包为 std::io::Readstd::io::Write 提供了实现,分别对应于 encoding_rs::Decoderencoding_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 的 ReadWrite 特性,因为虽然 readwrite 必须支持按字节操作,但字符编码器和解码器一次处理多个字节以处理多字节字符。该包中的类型使用小的缓冲区进行按字节操作,但尽可能绕过内部缓冲区并使用提供的缓冲区,以最大限度地减少双缓冲和内存消耗。

许可证

根据 Apache 许可证第 2 版许可。

另请参阅

依赖项

~3MB
~118K SLoC