故障排查:shell脚本输出乱码

发布时间:2023年12月20日

博客主页:https://tomcat.blog.csdn.net
博主昵称:农民工老王
主要领域:Java、Linux、K8S
期待大家的关注💖点赞👍收藏?留言💬
家乡

故障详情

最近的工作中遇到一个问题,有测试同事反馈,我的shell脚本运行有报错。如下图所示,测试结果是左侧所示,期待结果是右侧。
请添加图片描述

故障原因

我一看,我发现这命名是乱码,不是报错。打开shell脚本发现了报错来自如下一行代码:

resultStr=$("$python_bin" "$admin_dir/get_manipulator.py" "$@" )
# other code
echo "$resultStr"

我尝试单独运行"$python_bin" "$admin_dir/get_manipulator.py" "$@"是不会乱码的,但是先捕捉,再打印,就会遇到问题。
看来是shell脚本和python的字符编码不一致导致的。

解决方法

我通过iconv命令实现字符编码的转化。解决了这问题。具体代码如下所示:

resultStr=$("$python_bin" "$admin_dir/get_manipulator.py" "$@" | iconv -f GBK -t UTF-8)
# other code
echo "$resultStr"

iconv命令介绍

iconv是GUN软件libiconv中的一个命令,用以将文本从一种编码转换为另一种编码。更准确地说,它从?f选项的编码转换为?t选项的编码。这两种编码中的任何一种默认为当前区域设置的编码。依次读取和转换所有输入文件;如果没有给定inputfile,则使用标准输入。转换后的文本将打印为标准输出。

不是所有的Linux计算机都默认安装了libiconv。如果没有安装,可以访问官网 https://www.gnu.org/software/libiconv/ 进行下载。

以下是常用的参数:

-l 列出支持的编码。
-f 指定输入的编码。
-t 指定输出的编码。
-c 当给出此选项时,无法转换的字符将被静默丢弃,而不是导致转换错误。
-s 静默模式,不输出报错和警告。
-o 输出到指定文件。
–verbose 打印进度信息
–unicode?subst=formatstring 当提供此选项时,无法在目标编码中表示的 Unicode 字符将替换为占位符字符串formatstring。
–byte?subst=formatstring 当给出此选项时,输入中在源编码中无效的字节将替换为从给定格式字符串构造的占位符字符串formatstring。
–widechar?subst=formatstring 当给出此选项时,输入中在源编码中无效的宽字符将替换为占位符字符串formatstring。

示例命令如下:

# 列出了支持的编码
iconv -l 

# 转换gbk编码文件为utf-8编码文件
iconv  -f gbk -t utf-8 gbk.html > utf8.html
iconv  -f gbk -t utf-8 gbk.html -o utf8.html

如需转载,请注明本文的出处:农民工老王的CSDN博客https://blog.csdn.net/monarch91 。

文章来源:https://blog.csdn.net/monarch91/article/details/133741657
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。