diff --git a/src/uu/expr/src/syntax_tree.rs b/src/uu/expr/src/syntax_tree.rs index c11689a07..4dafffbf0 100644 --- a/src/uu/expr/src/syntax_tree.rs +++ b/src/uu/expr/src/syntax_tree.rs @@ -10,7 +10,7 @@ //! * `` //! -// spell-checker:ignore (ToDO) binop binops ints paren prec +// spell-checker:ignore (ToDO) binop binops ints paren prec multibytes use num_bigint::BigInt; use num_traits::{One, Zero}; @@ -465,7 +465,9 @@ fn operator_match(values: &[String]) -> Result { fn prefix_operator_length(values: &[String]) -> String { assert!(values.len() == 1); - values[0].len().to_string() + // Use chars().count() as we can have some multibytes chars + // See https://github.com/uutils/coreutils/issues/3132 + values[0].chars().count().to_string() } fn prefix_operator_index(values: &[String]) -> String { diff --git a/tests/by-util/test_expr.rs b/tests/by-util/test_expr.rs index 30e3016a3..3a753aa1b 100644 --- a/tests/by-util/test_expr.rs +++ b/tests/by-util/test_expr.rs @@ -1,3 +1,5 @@ +// spell-checker:ignore αbcdef + use crate::common::util::*; #[test] @@ -95,6 +97,27 @@ fn test_and() { new_ucmd!().args(&["", "&", "1"]).run().stdout_is("0\n"); } +#[test] +fn test_length_fail() { + new_ucmd!().args(&["length", "αbcdef", "1"]).fails(); +} + +#[test] +fn test_length() { + new_ucmd!() + .args(&["length", "abcdef"]) + .succeeds() + .stdout_only("6\n"); +} + +#[test] +fn test_length_mb() { + new_ucmd!() + .args(&["length", "αbcdef"]) + .succeeds() + .stdout_only("6\n"); +} + #[test] fn test_substr() { new_ucmd!()