UTF8编码和SHIFT-JIS编码文件同时存在且关联调用,shell乱码问题

Linux问题:在A和B服务器中执行:echo $LANG,结果都是:ja_JP.UTF-8。(ja和JP代表日文和日本)

在B服务器中,有一个文件b.sh,文件编码是Shift-jis(这是日文的编码)。现要模拟错误,将b.sh改成b002.sh。然后,

在A服务器中,有一个文件a.sh,文件编码是UTF-8,此文件的内容如下:


代码块1


ssh ${REMOTE_USER}@${REMOTE_HOST} << remotessh

cd ${DB_SHELL_PATH}

./b.sh        ---这里在调用执行B服务的b.sh文件,错误就出在这行,因为此文件不存在。


代码块3

A服务器中用的客户端软件是Tera Term,分下面情况:

情况1:“漢字-受信”的编码设置为Shift-jis时,代码块1和代码块3执行时就不会有乱码,但这时“./b.sh”这行代码执行时会产生乱码,报的错误如下:

    -bash: line 12 ./b.sh: XXXXXXXXX(XXX这里是乱码。)

情况2:但如果“漢字-受信”的编码设置为UTF-8,这样在执行a.shell时,代码块1和代码块3执行时就会有乱码,而“./b.sh”这行代码执行时就不会有乱码,报的错误是日文,翻译出来的意思是:“没有那样的文件或目录,”,如果是用英文报出来这个错误,一定就是:“No such file or directory.”,这应当是Linux系统报出来的错误。

目标:a和b文件的编码不能修改,TeraTerm中“漢字-受信”的编码必须得设置为Shift-jis,然后使“./b.sh”这行代码执行时,也不会有乱码就行。

我个人认为:Shift-jis(这是日文的编码)其实和GB2312是同样的道理。非常感谢大家!

参考GPT和自己的思路:这个问题的原因是因为a.sh和b.sh的编码方式不同,导致在不同的字符集下执行代码会出现乱码。解决方法是在a.sh代码中添加一行代码,用iconv命令将./b.sh转换为utf-8编码,并将结果存储到一个临时文件中,然后执行该临时文件。具体代码如下:

1. 
2. 代码块1
3. 
4. 
5. ssh ${REMOTE_USER}@${REMOTE_HOST} << remotessh
6. 
7. cd ${DB_SHELL_PATH}
8. 
9. iconv -f SHIFT-JIS -t UTF-8 ./b.sh > tmp_b.sh
10. chmod +x tmp_b.sh
11. ./tmp_b.sh
12. 
13. 代码块3

这样就可以在任何字符集下执行a.sh代码,同时也能够正确地执行b.sh代码。

你好,您的问题我看不太懂(个人水平有限),我问了两种ai,得到的答案不同,你参考一下,看是否有用,如果没用,请忽略:

第一种

解决方案:

可以在执行“./b.sh”这行代码前,先将当前终端的编码设置为Shift-jis,然后再执行该行代码。可以在a.sh文件中加入如下代码:

    export LANG=ja_JP.Shift_JIS
    echo -e "\033\$\"\`echo -e '\033[0m'\`"
    ./b.sh

其中,第一行将LANG环境变量设置为Shift-jis编码,第二行是将终端的编码设置为Shift-jis,第三行就是执行“./b.sh”这行代码了。需要注意的是,在第二行中,\033[0m是表示将终端的编码设置为默认值,这里用了反引号,是为了在双引号内嵌套单引号。

这样就可以在TeraTerm中将“漢字-受信”的编码设置为Shift-jis,执行a.sh时,代码块1和代码块3不会有乱码,同时执行“./b.sh”这行代码也不会有乱码了。

第二种

由于b.sh文件的编码是Shift-jis,而在A服务器中执行“./b.sh”这行代码时产生了乱码,可以考虑在A服务器上设置LANG环境变量为ja_JP.SJIS,以确保正确解释Shift-jis编码。

具体操作方法为,在A服务器中执行以下命令:

export LANG=ja_JP.SJIS

然后再执行a.sh文件。这样,应该就可以避免在执行“./b.sh”这行代码时产生乱码了。

需要注意的是,这种方法只适用于当前会话,在新的会话中需要重新设置LANG环境变量。另外,如果在其他地方执行相同的代码,也需要进行相应的环境变量设置。