簡體   English   中英

bash中的反向字符串丟失

[英]Reverse string in bash missing

所有,

我有一個解密過程,該過程的一部分會反轉編碼的字符串(僅作為另一個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出於某種原因忽略了該字符。

您可以使用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

我認為您必須在您的環境中遇到本地化/編碼問題。 我懷疑它甚至會影響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

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
$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM