linux 下面用 shell 执行 java 程式shell 是既定的编码 ASCII (ISO-8859)内容:app=$(basename $0)workday=date +%Y%m%djava Worklog $app $workday "工作日誌"
java 程式是用 UTF-8 编码, 转写到档案却是乱码请问如何解约编码不同造成乱码的问题
1 个回答
4
zivzhong
iT邦研究生 4 级 ‧ 2025-02-21 15:44:01
这个问题主要是因为 JVM 预设使用系统的档案编码(在你的情况下是 ASCII/ISO-8859),而你的 Java 程式和来源码是以 UTF-8 编码所撰写,导致在处理中文字串(例如「工作日誌」)时出现乱码。
解决方法有两种:
-
强制 JVM 使用 UTF-8 编码:
在执行 Java 程式时,加上参数-Dfile.encoding=UTF-8
,例如:app=$(basename $0) workday=$(date +%Y%m%d) java -Dfile.encoding=UTF-8 Worklog $app $workday "工作日誌"
这样 JVM 就会以 UTF-8 来处理字串与档案输出,避免乱码。
-
修改 Shell 环境的 Locale 设定:
设定环境变数,例如:export LANG=zh_TW.UTF-8 export LC_ALL=zh_TW.UTF-8
在这样的环境下执行 shell script,就能确保 Shell 的输出也是 UTF-8,进而和 Java 程式保持一致。
建议可以两种方式结合使用,确保从 Shell 到 JVM 整个流程都採用 UTF-8 编码,这样就能有效解决乱码问题。
-
1 -
-
magread
iT邦新手 5 级 ‧
2025-02-22 15:56:40
我发现执行:
export LC_ALL=zh_TW.UTF-8
会有问题, 所以我执行:
locale -a
结果发现 linux 没有安装繁体中文语系
然后我 java 加了:
Charset.defaultCharset()
显示的是 "US-ASCII"
我不确定是不是这样造成转码问题?
所以我另外装了一台 rocky linux vm 来模拟测试
(vm有特别安装了繁体中文语系)
我先模拟 user 环境 profile 只设定:
export LANG=zh_TW.BIG5
然后执行原本的 shell, java 跑出来的:
Charset.defaultCharset()
显示的是 "BIG5"
并且执行结果没有乱码
想请问 java vm 在转换编码, 跟安装繁体中文语系套件有关吗?
所以我另外装了一台 rocky linux vm 来模拟测试
(vm有特别安装了繁体中文语系)
我先模拟 user 环境 profile 只设定:
export LANG=zh_TW.BIG5
然后执行原本的 shell, java 跑出来的:
Charset.defaultCharset()
显示的是 "BIG5"
并且执行结果没有乱码
想请问 java vm 在转换编码, 跟安装繁体中文语系套件有关吗?
修改