使用SpringBoot定时设置Ubuntu编码为UTF8

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。使用SpringBoot定时设置Ubuntu编码为UTF8,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

笔者拿到的某一Ubuntu服务器缺少各种依赖包,如ssh、hashlib、requests、gdbm…等一箩筐,由于机子不能联网,也已经在使用中,没法再重装系统,只能离线单独安装这些依赖包。好不容易解决这些问题之后,部署SpringBoot应用到服务器,发现了打印的日志显示中文为问号的乱码问题。当时通过网上各种查找资料,也得到了短暂解决,并且写成文章(在Ubuntu上的文件内容显示中文乱码的解决方案:https://blog.csdn.net/Cai181191/article/details/120882931)。但是这种设置Ubuntu字符编码问题会失效,没过几天就被重置回来了,在命令控制台输入 locale 命令即可看到。
正常:
LANG=zh_CN.utf8
LANGUAGE=zh_CN:zh:en_US:en
LC_CTYPE=”zh_CN.utf8″
LC_NUMERIC=”zh_CN.utf8″
LC_TIME=”zh_CN.utf8″
LC_COLLATE=”zh_CN.utf8″
LC_MONETARY=”zh_CN.utf8″
LC_MESSAGES=”zh_CN.utf8″
LC_PAPER=”zh_CN.utf8″
LC_NAME=”zh_CN.utf8″
LC_ADDRESS=”zh_CN.utf8″
LC_TELEPHONE=”zh_CN.utf8″
LC_MEASUREMENT=”zh_CN.utf8″
LC_IDENTIFICATION=”zh_CN.utf8″
LC_ALL=zh_CN.utf8

失效:
LANG=POSIX
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=”POSIX”
LC_TIME=”POSIX”
LC_COLLATE=”POSIX”
LC_MONETARY=”POSIX”
LC_MESSAGES=”POSIX”
LC_PAPER=”POSIX”
LC_NAME=”POSIX”
LC_ADDRESS=”POSIX”
LC_TELEPHONE=”POSIX”
LC_MEASUREMENT=”POSIX”
LC_IDENTIFICATION=”POSIX”
LC_ALL=

于是想到使用SpringBoot执行Linux命令或Shell脚本,定时设置Ubuntu字符编码为UTF8。

LinuxUtils.java

public class LinuxUtils {
    /**
     * 说明:执行shell命令
     *
     * String[] cmd = { "sh", "-c", "lsmod |grep linuxVmux" }
     * 或者
     * String[] cmd = { "sh", "-c", "./load_driver.sh" }
     * 如 cmd 为 ls,则在Linux命令控制台执行该命令
     *
     * int type = 1
     * 若 type 为 1,则返回是否执行成功,值为 success 或 fail
     * 若 type 不为 1,则返回命令执行后的输出内容
     */
    public static String runCommand(String[] cmd, int type) {
        StringBuffer buf = new StringBuffer(1000);
        String result = "fail";
        InputStreamReader inputStreamReader = null;
        LineNumberReader lineNumberReader = null;
        try {
            Process pos = Runtime.getRuntime().exec(cmd);
            pos.waitFor();
            inputStreamReader = new InputStreamReader(pos.getInputStream());
            lineNumberReader = new LineNumberReader(inputStreamReader);
            if (type == 1) {
                if (pos.exitValue() == 0) {
                    result = "success";
                }
            } else {
                buf.append("\n");
                String ln = "";
                while ((ln = lineNumberReader.readLine()) != null) {
                    buf.append(ln + "\n");
                }
                result = buf.toString();
            }
        } catch (java.io.IOException e) {
            throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        } finally {
            try {
                if (lineNumberReader != null) {
                    lineNumberReader.close();
                }

                if (inputStreamReader != null) {
                    inputStreamReader.close();
                }
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 说明:执行简单命令
     *
     * String cmd = "ls"
     * 如 cmd 为 ls,则在Linux命令控制台执行该命令
     *
     * int type = 1
     * 若 type 为 1,则返回是否执行成功,值为 success 或 fail
     * 若 type 不为 1,则返回命令执行后的输出内容
     */
    public static String runCommand(String cmd, int type) {
        StringBuffer buf = new StringBuffer(1000);
        String result = "fail";
        InputStreamReader inputStreamReader = null;
        LineNumberReader lineNumberReader = null;
        try {
            Process pos = Runtime.getRuntime().exec(cmd);
            pos.waitFor();
            if (type == 1) {
                if (pos.exitValue() == 0) {
                    result = "success";
                }
            } else {
                buf.append("\n");
                inputStreamReader = new InputStreamReader(pos.getInputStream());
                lineNumberReader = new LineNumberReader(inputStreamReader);
                String ln = "";
                while ((ln = lineNumberReader.readLine()) != null) {
                    buf.append(ln + "\n");
                }
                result = buf.toString();
            }
        } catch (java.io.IOException e) {
            throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        } finally {
            try {
                if (lineNumberReader != null) {
                    lineNumberReader.close();
                }

                if (inputStreamReader != null) {
                    inputStreamReader.close();
                }
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
        return result;
    }
}

TimingSetLocale.java

import org.example.utils.LinuxUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 定时设置服务器字符编码
 */
@Configuration
@EnableScheduling
public class TimingSetLocale {

    private static final Logger log = LoggerFactory.getLogger(TimingSetLocale.class);

    /**
     * 说明:自从Spring3.0的版本后,cron表达式只能支持6个字段,也就是不支持年份的表达式,若需要年份的话可以集成quartz
     */
    // @Scheduled(cron = "0 0 9,21 ? * *") // 每天上午9点和下午9点执行一次
    // @Scheduled(cron = "0 10 9 ? * *") // 每天上午9点10分执行一次
    @Scheduled(initialDelay = 5000, fixedRate = 3600000) // 容器启动后延迟5秒执行一次,之后每3600秒再执行一次
    private void TimingSetLocaleOn9amAnd21pm() {
        Date dt = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            String[] cmd_LANG = { "/bin/sh", "-c", "cd /local/springboot3.0; export LANG=zh_CN.utf8" };
            String[] cmd_LC_ALL = { "/bin/sh", "-c", "cd /local/springboot3.0; export LC_ALL=zh_CN.utf8" };
            String[] cmd_LANGUAGE = { "/bin/sh", "-c", "cd /local/springboot3.0; export LANGUAGE=zh_CN:zh:en_US:en" };
            LinuxUtils.runCommand(cmd_LANG, 1);
            LinuxUtils.runCommand(cmd_LC_ALL, 1);
            LinuxUtils.runCommand(cmd_LANGUAGE, 1);

            String[] cmdArr = { "/bin/sh", "-c", "cd /local/springboot3.0; locale" }; // 先执行 cd /local/springboot3.0 ,再执行 locale
            String res = LinuxUtils.runCommand(cmdArr, 0);
            log.info("---- ---- ---- ---- 定时设置服务器字符编码成功 时间:(" + df.format(dt) + ") ---- ---- ---- ----");
            log.info("返回信息:" + res);
        } catch (Exception e) {
            log.info("---- ---- ---- ---- 定时设置服务器字符编码失败 时间:(" + df.format(dt) + ") ---- ---- ---- ----");
            log.info("失败原因:" + e.getMessage());
        }
    }
}

这样就可以永久设置Ubuntu编码为UTF8啦。

使用SpringBoot定时设置Ubuntu编码为UTF8

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151146.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!