diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock index 37aa15a8b..d9b3d3ec0 100644 --- a/src/rust/Cargo.lock +++ b/src/rust/Cargo.lock @@ -157,8 +157,8 @@ dependencies = [ "bindgen 0.64.0", "cfg-if", "clap", + "encoding_rs", "env_logger", - "iconv", "leptonica-sys", "lib_ccxr", "log", @@ -293,18 +293,21 @@ dependencies = [ "syn 2.0.99", ] -[[package]] -name = "dyn_buf" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c57ab96715773d9cb9789b38eb7cbf04b3c6f5624a9d98f51761603376767c" - [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_logger" version = "0.8.4" @@ -400,16 +403,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "iconv" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e6a7db0df823ef299ef75b6951975c7a1f9019910b3665614bac4161bab1a9" -dependencies = [ - "dyn_buf", - "libc", -] - [[package]] name = "icu_collections" version = "1.5.0" diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index b94861db2..7a0701195 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -13,7 +13,6 @@ crate-type = ["staticlib"] [dependencies] log = "0.4.26" env_logger = "0.8.4" -iconv = "0.1.1" palette = "0.6.1" rsmpeg = { version = "0.14.2", optional = true, features = [ "link_system_ffmpeg", @@ -28,6 +27,7 @@ cfg-if = "1.0.0" num-integer = "0.1.46" lib_ccxr = { path = "lib_ccxr" } url = "2.5.4" +encoding_rs = "0.8.5" [build-dependencies] bindgen = "0.64.0" diff --git a/src/rust/src/decoder/tv_screen.rs b/src/rust/src/decoder/tv_screen.rs index 5a59e3d81..bfd695a28 100644 --- a/src/rust/src/decoder/tv_screen.rs +++ b/src/rust/src/decoder/tv_screen.rs @@ -17,6 +17,7 @@ use crate::{ bindings::*, utils::{is_false, is_true}, }; +use encoding_rs::Encoding; use log::{debug, warn}; @@ -232,8 +233,17 @@ impl dtvcc_tv_screen { }; debug!("Charset: {}", charset); - let op = iconv::decode(&buf, charset).map_err(|err| err.to_string())?; - writer.write_to_file(op.as_bytes())?; + // Look up the encoding by label (name) + if let Some(encoding) = Encoding::for_label(charset.as_bytes()) { + let (cow, _encoding_used, had_errors) = encoding.decode(&buf); + if had_errors { + println!("Warning: Had errors during encoding from {charset} to UTF-8"); + } + if _encoding_used != encoding { + println!("Warning: Encoding specified ({}) does not match encoding detected ({})",charset,_encoding_used.name()); + } + writer.write_to_file(cow.as_bytes())?; + } } } else { writer.write_to_file(&buf)?;