diff --git a/src/main.rs b/src/main.rs index f81ed31..8773614 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,10 +7,10 @@ use async_zip::write::{EntryOptions, ZipFileWriter}; use async_zip::Compression; use clap::{Parser, ValueEnum}; use encoding::label::encoding_from_whatwg_label; -use encoding::EncodingRef; +use encoding::{all::UTF_8, Encoding, EncodingRef}; use encoding::{DecoderTrap, EncoderTrap}; use regex::Regex; -use tokio::io::{AsyncReadExt, BufWriter, AsyncWriteExt}; +use tokio::io::{AsyncReadExt, AsyncWriteExt, BufWriter}; use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; use tokio::{fs, task}; @@ -119,13 +119,30 @@ async fn transcoder_task( encoding_from: EncodingRef, encoding_to: EncodingRef, ) { + let is_encodings_same = encoding_from.name() == encoding_to.name(); + let is_src_encodig_native = UTF_8.name() == encoding_from.name(); + let is_dst_encodig_native = UTF_8.name() == encoding_to.name(); + while let Some(FileData { name, data }) = rx.recv().await { - let new_data = task::block_in_place(move || { - let text = encoding_from.decode(&data, DecoderTrap::Ignore).unwrap(); - encoding_to - .encode(text.as_str(), EncoderTrap::Ignore) - .unwrap() - }); + let new_data = if is_encodings_same { + data + } else { + task::block_in_place(move || { + let text = if is_src_encodig_native { + String::from_utf8(data).unwrap() + } else { + encoding_from.decode(&data, DecoderTrap::Ignore).unwrap() + }; + + if is_dst_encodig_native { + text.into_bytes() + } else { + encoding_to + .encode(text.as_str(), EncoderTrap::Ignore) + .unwrap() + } + }) + }; tx.send(FileData { name,