bash 中的反向字符串缺失
Reverse string in bash missing
全部,
我有一个解密过程,其中有一部分会反转编码的(仅作为另一个 ascii 字符)字符串。
字符串是...
vtr«¥ºc€a
我使用的反向命令是...
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 出于某种原因忽略了该字符。
您可以使用 rev
实用工具:
enc_pass="vtr«¥ºc€a"
rev <<< "$enc_pass"
a€cº¥«rtv
LC_ALL='en_US.UTF-8'
(your code)
echo "${#reverse}"
10
LC_ALL='C'
(your code)
echo "${#reverse}"
16
我认为您的环境中一定存在 localization/encoding 问题。我怀疑这甚至会影响 rev
,尽管它是一个非标准实用程序,所以我不能肯定地说。这对我来说很好用:
rev() {
local -x LC_ALL=en_US.UTF-8
if [[ ! "" ]]; then
echo
return
fi
printf '%s' "${1: -1:1}"
rev "${1:0: -1}"
}
$ rev 'vtr«¥ºc€a'
a€cº¥«rtv
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
$
全部,
我有一个解密过程,其中有一部分会反转编码的(仅作为另一个 ascii 字符)字符串。
字符串是...
vtr«¥ºc€a
我使用的反向命令是...
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 出于某种原因忽略了该字符。
您可以使用 rev
实用工具:
enc_pass="vtr«¥ºc€a"
rev <<< "$enc_pass"
a€cº¥«rtv
LC_ALL='en_US.UTF-8'
(your code)
echo "${#reverse}"
10
LC_ALL='C'
(your code)
echo "${#reverse}"
16
我认为您的环境中一定存在 localization/encoding 问题。我怀疑这甚至会影响 rev
,尽管它是一个非标准实用程序,所以我不能肯定地说。这对我来说很好用:
rev() {
local -x LC_ALL=en_US.UTF-8
if [[ ! "" ]]; then
echo
return
fi
printf '%s' "${1: -1:1}"
rev "${1:0: -1}"
}
$ rev 'vtr«¥ºc€a'
a€cº¥«rtv
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
$