Rust字符编码转换库encoding_c_mem的使用:高效内存操作与多编码格式支持
Rust字符编码转换库encoding_c_mem的使用:高效内存操作与多编码格式支持
encoding_c_mem是encoding_rs库mem模块的FFI包装器。
授权许可
请查看名为COPYRIGHT的文件。
不支持Unwinding
这个crate是为使用panic = 'abort'
编译的二进制文件设计的,这是正确性所必需的!跨FFI的unwinding是未定义行为,如果编译时启用了unwinding,这个crate不会尝试防止跨FFI的unwinding。
示例代码
use encoding_c_mem::*;
fn main() {
// 示例:将UTF-8字符串转换为UTF-16
let utf8_str = "Hello, 世界!";
let mut utf16_buf = vec![0u16; utf8_str.len() * 2]; // 预分配足够的空间
let (result, read, written) = convert_utf8_to_utf16(
utf8_str.as_bytes(),
&mut utf16_buf,
false // 是否允许替换
);
if result == EncoderResult::InputEmpty {
println!("转换成功: 读取{}字节,写入{}个UTF-16代码单元", read, written);
let utf16_str = &utf16_buf[..written];
println!("UTF-16编码结果: {:?}", utf16_str);
} else {
println!("转换过程中出现问题");
}
// 示例:检测字符串中的Latin1字符
let latin1_upto = utf8_latin1_up_to(utf8_str.as_bytes());
println!("字符串中前{}个字节是Latin1字符", latin1_upto);
}
完整示例
// 添加依赖到Cargo.toml:
// encoding_c_mem = "0.2.6"
use encoding_c_mem::*;
fn main() {
// 1. 转换UTF-8到UTF-16
let utf8_text = "Rust编程语言";
convert_utf8_to_utf16_example(utf8_text);
// 2. 转换UTF-16到UTF-8
let utf16_text: Vec<u16> = vec![0x0041, 0x0042, 0x0043, 0x4E2D, 0x6587];
convert_utf16_to_utf8_example(&utf16_text);
// 3. 检查Latin1字符
check_latin1_example("ASCII only");
check_latin1_example("包含中文");
}
fn convert_utf8_to_utf16_example(utf8_str: &str) {
let mut buffer = vec![0u16; utf8_str.len() * 2]; // 预分配足够空间
let (result, read, written) = convert_utf8_to_utf16(
utf8_str.as_bytes(),
&mut buffer,
false // 不允许替换
);
match result {
EncoderResult::InputEmpty => {
println!("UTF-8到UTF-16转换成功:");
println!(" 读取字节数: {}", read);
println!(" 写入代码单元数: {}", written);
println!(" 结果: {:?}", &buffer[..written]);
},
EncoderResult::OutputFull => eprintln!("输出缓冲区不足"),
EncoderResult::Malformed(_, _) => eprintln!("输入包含无效UTF-8序列"),
}
}
fn convert_utf16_to_utf8_example(utf16_str: &[u16]) {
let mut buffer = vec![0u8; utf16_str.len() * 3]; // UTF-8最多需要3字节/字符
let (result, read, written) = convert_utf16_to_utf8(
utf16_str,
&mut buffer,
false // 不允许替换
);
match result {
EncoderResult::InputEmpty => {
println!("UTF-16到UTF-8转换成功:");
println!(" 读取代码单元数: {}", read);
println!(" 写入字节数: {}", written);
if let Ok(s) = std::str::from_utf8(&buffer[..written]) {
println!(" 结果字符串: {}", s);
}
},
EncoderResult::OutputFull => eprintln!("输出缓冲区不足"),
EncoderResult::Malformed(_, _) => eprintln!("输入包含无效UTF-16序列"),
}
}
fn check_latin1_example(text: &str) {
let upto = utf8_latin1_up_to(text.as_bytes());
if upto == text.len() {
println!("'{}'完全由Latin1字符组成", text);
} else {
println!("'{}'中前{}个字节是Latin1字符", text, upto);
}
}
版本说明
0.2.6
- 从版权声明中移除年份
0.2.5
- 在Cargo清单中指定links值
- 从构建脚本中发出include_dir变量,以便依赖此crate的其他构建脚本可以依赖它
0.2.4
- 仅文档修复
0.2.3
- 仅文档修复
0.2.2
- 包装convert_utf8_to_utf16_without_replacement、utf8_latin1_up_to和str_latin1_up_to
0.2.1
- 修复README中的拼写错误
0.2.0
- 在C和C++中使用char而不是uint8_t表示8位单元文本
0.1.1
- 向C头文件添加包含保护
0.1.0
- encoding_c_mem的初始版本
1 回复