--- ./rust/libnewsboat/src/utils.rs.orig	2021-05-17 17:24:43.019948076 +0000
+++ ./rust/libnewsboat/src/utils.rs	2021-05-17 17:45:43.814961688 +0000
@@ -891,6 +891,7 @@
 
 // On FreeBSD, link with GNU libiconv; the iconv implementation in libc doesn't support //TRANSLIT
 // and WCHAR_T. This is also why we change the symbol names from "iconv" to "libiconv" below.
+/*
 #[cfg_attr(target_os = "freebsd", link(name = "iconv"))]
 extern "C" {
     #[cfg_attr(target_os = "freebsd", link_name = "libiconv_open")]
@@ -906,7 +907,7 @@
     #[cfg_attr(target_os = "freebsd", link_name = "libiconv_close")]
     pub fn iconv_close(cd: iconv_t) -> c_int;
 }
-
+*/
 /// Annotates the target encoding (`tocode`) with `//TRANSLIT` if conversion between `fromcode` and
 /// `tocode` might require transliterating some characters.
 pub fn translit(tocode: &str, fromcode: &str) -> String {
@@ -920,7 +921,7 @@
     // However, in our case it's okay: even if multiple threads run this function, they will all
     // arrive at the same result, so we don't care if those threads race to write that result into
     // the variable.
-    static mut STATE: TranslitState = TranslitState::Unknown;
+    static mut STATE: TranslitState = TranslitState::Unsupported;
 
     // TRANSLIT is not needed when converting to unicode encodings
     if tocode == "utf-8" || tocode == "WCHAR_T" {
@@ -931,6 +932,7 @@
 
     unsafe {
         if STATE == TranslitState::Unknown {
+            /*
             // The three calls to expect() can't panic because the input strings come from either:
             //
             // - our code, and we won't deliberately put a NUL byte inside an encoding name; or
@@ -968,6 +970,7 @@
                 STATE = TranslitState::Supported;
                 iconv_close(cd);
             }
+            */
         }
     }
 
@@ -987,7 +990,9 @@
     let mut result = vec![];
 
     let tocode_translit = translit(tocode, fromcode);
-
+    
+    result = tocode_translit.as_bytes().to_vec();
+    /*
     // Illegal and incomplete multi-byte sequences will be replaced by this
     // placeholder. By default, we use an ASCII value for "question mark".
     let question_mark = {
@@ -1078,21 +1083,25 @@
 
         iconv_close(cd);
     }
-
+    */
     result
 }
 
 fn get_locale_encoding() -> String {
     unsafe {
-        use libc::{nl_langinfo, CODESET};
+        use libc::{setlocale, LC_CTYPE};
         use std::ffi::CStr;
-
-        let codeset = CStr::from_ptr(nl_langinfo(CODESET));
-        // Codeset names are ASCII, so the below expect() should never panic.
-        codeset
-            .to_str()
-            .expect("Locale codeset name is not a valid UTF-8 string")
-            .to_owned()
+        // reimplement from C version https://github.com/crystax/android-vendor-gnu-grep/blob/master/lib/nl_langinfo.c
+        let mut locale = CStr::from_ptr(setlocale(LC_CTYPE, std::ptr::null())).to_str().expect("Null locale found").to_owned();
+        locale = match locale.find(".") {
+            Some(pos) => locale[(pos+1)..].to_string(),
+            None => locale
+        };
+        locale = match locale.find("@") {
+            Some(pos) => locale[..pos].to_string(),
+            None => locale
+        };
+        locale
     }
 }
 
