bash中的反向字符串丢失

时间:2015-01-30 15:46:23

标签: bash reverse

所有

我有一个解密过程,其中有一个部分可以反转编码的(仅作为另一个ascii字符)字符串。

字符串是......

VTR«¥ºC€一个

我正在使用的反向命令是......

enc_pass="vtr«­¥ºc€a"
reverse=""

len=${#enc_pass}
for (( i=$len-1; i>=0; i-- ))
do
      reverse="$reverse${enc_pass:$i:1}"
done

echo $reverse

但是当我检查长度时,它的长度为9个字符,而不是10个,我发现它的字符被忽略了。

有什么办法可以满足这个要求吗?我很丢失它,不知道下一步该去哪里。


事实证明,主要问题在于新服务器上的LANG。旧服务器有LANG =“en_GB”,新服务器LANG =“en_GB.UTF-8”

将LANG更改回en_GB解决了逆转问题,因为UTF-8出于某种原因忽略了该字符。

3 个答案:

答案 0 :(得分:2)

您可以使用rev实用程序:

enc_pass="vtr«­¥ºc€a"
rev <<< "$enc_pass"
a€cº¥­«rtv

答案 1 :(得分:1)

LC_ALL='en_US.UTF-8'
(your code)
echo "${#reverse}"
10

LC_ALL='C'
(your code)
echo "${#reverse}"
16

我认为您的环境中必须存在本地化/编码问题。我怀疑它甚至会影响rev,虽然它是一个非标准的实用程序,所以我无法肯定地说。这对我来说很好:

rev() {
    local -x LC_ALL=en_US.UTF-8
    if [[ ! "$1" ]]; then
        echo
        return
    fi
    printf '%s' "${1: -1:1}"
    rev "${1:0: -1}"
}
$ rev 'vtr«­¥ºc€a'
a€cº¥­«rtv

答案 2 :(得分:1)

rev命令没什么大帮助,至少对二进制文件来说是因为rev终止于0x00。

$ export LC_ALL='en_US.UTF-8'
$ echo -e "\xe4" | rev
rev: stdin: Invalid or incomplete multibyte or wide character
$ 
$ export LC_ALL='de_DE.ISO-8859-1'
$ echo -e "\xe4" | rev | od -tx1
0000000 e4 0a
0000002
$ 
$ export LC_ALL='en_US.UTF-8'
$ echo -e "te\x00st" | rev | od -tx1
0000000 65 74 0a
0000003
$