Drop1 2023-05-17 20:46 采纳率: 37.5%
浏览 35

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是同样的道理。非常感谢大家!

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-05-17 20:49
    关注

    参考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代码。

    评论

报告相同问题?

问题事件

  • 修改了问题 5月18日
  • 修改了问题 5月17日
  • 创建了问题 5月17日

悬赏问题

  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢
  • ¥15 vxworks交叉编译gcc报错error: missing binary operator before token "("
  • ¥15 JSzip压缩文件时如何设置解压缩密码