< 返回版块

eweca-d 发表于 2022-04-22 17:11

求助一下,我的大概想法是读取ANSI文件至Vec<u8>然后解码到UTF-8的String。有什么好用的库推荐一下么?

评论区

写评论
作者 eweca-d 2022-04-23 13:45

后来试了下,流读取解码非常可行,之前在其他的编程语言里记得用过类似的写法,感觉用起来很方便。感谢!

--
👇
Bai-Jinlin: 也可以搭配一下,要是流读取解码的话用这个库能少写点代码。

作者 eweca-d 2022-04-23 13:41

可行!感谢大佬。另外anyhow这个库之前没发现,刚刚试了下,觉得超好用,发现宝了。

--
👇
c5soft: 有现成的库可用,经过生产坏境的检验没有任何问题

gbk2utf8.rs

use anyhow::{anyhow, Result};
use encoding::{all::GB18030, DecoderTrap, EncoderTrap, Encoding};

fn gb18030bytes_to_string(bytes: &[u8]) -> Result<String> {
    GB18030
        .decode(bytes, DecoderTrap::Strict)
        .map_err(|e| anyhow!("gb18030bytes_to_string failure: {:?}", e))
}

fn string_to_gb18030bytes(string: &str) -> Result<Vec<u8>> {
    GB18030
        .encode(string, EncoderTrap::Strict)
        .map_err(|e| anyhow!("string_to_gb18030bytes failure: {:?}", e))
}

Cargo.toml

anyhow = "1.0.57"
encoding = "0.2.33"
c5soft 2022-04-23 08:40

有现成的库可用,经过生产坏境的检验没有任何问题

gbk2utf8.rs

use anyhow::{anyhow, Result};
use encoding::{all::GB18030, DecoderTrap, EncoderTrap, Encoding};

fn gb18030bytes_to_string(bytes: &[u8]) -> Result<String> {
    GB18030
        .decode(bytes, DecoderTrap::Strict)
        .map_err(|e| anyhow!("gb18030bytes_to_string failure: {:?}", e))
}

fn string_to_gb18030bytes(string: &str) -> Result<Vec<u8>> {
    GB18030
        .encode(string, EncoderTrap::Strict)
        .map_err(|e| anyhow!("string_to_gb18030bytes failure: {:?}", e))
}

Cargo.toml

anyhow = "1.0.57"
encoding = "0.2.33"
作者 eweca-d 2022-04-22 22:04

ANSI确实不是UTF-8,搞不了。会报错的。

--
👇
caohaiwd: 标准库就有,用 String::from_utf8 或者 String::from_utf8_lossy

作者 eweca-d 2022-04-22 22:03

感谢,长见识了!大佬你这真的太内行了。

--
👇
LuoZijun: 这个你自己写一个就行了,其实也没有几行代码。

我随手写了一个:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=abb618a824d827e80e2478c7b1190bde

作者 eweca-d 2022-04-22 22:02

非常感谢!因为我薄弱的基础,我之前甚至没有意识到ANSI不是类似UTF-8一样普适的数据集。。。。难怪一直找不到可用的库。感谢,前者可行,后者流读取解码,我再尝试下。

--
👇
Bai-Jinlin: 也可以搭配一下,要是流读取解码的话用这个库能少写点代码。

use encoding_rs_io::DecodeReaderBytesBuilder;
use encoding_rs::GBK;
let file = File::open("/path/to/file").unwrap();
let mut decoder=DecodeReaderBytesBuilder::new().encoding(Some(GBK)).build(file);
let mut decode=String::new();
decoder.read_to_string(&mut decode).unwrap()
Bai-Jinlin 2022-04-22 21:46

也可以搭配一下,要是流读取解码的话用这个库能少写点代码。

use encoding_rs_io::DecodeReaderBytesBuilder;
use encoding_rs::GBK;
let file = File::open("/path/to/file").unwrap();
let mut decoder=DecodeReaderBytesBuilder::new().encoding(Some(GBK)).build(file);
let mut decode=String::new();
decoder.read_to_string(&mut decode).unwrap()
Bai-Jinlin 2022-04-22 21:29

encoding_rs就行,给你个简单的例子。

use encoding_rs::GBK;
let mut file=File::open("path/to/file").unwrap();
let mut buf=Vec::new();
file.read_to_end(&mut buf).unwrap();
let (decode_str,_,_)=GBK.decode(&buf);
let decode_str:String=decode_str.into()
LuoZijun 2022-04-22 20:48

这个你自己写一个就行了,其实也没有几行代码。

我随手写了一个:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=abb618a824d827e80e2478c7b1190bde

LuoZijun 2022-04-22 20:48

ANSI 字符集 和 UTF-8 字符集是不一样的,你不能把 ANSI 数据直接当成 UTF8 数据去处理。

--
👇
caohaiwd: 标准库就有,用 String::from_utf8 或者 String::from_utf8_lossy

caohaiwd 2022-04-22 18:23

标准库就有,用 String::from_utf8 或者 String::from_utf8_lossy

1 共 11 条评论, 1 页