笔者拿到的某一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啦。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151146.html