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 编码所撰写,导致在处理中文字串(例如「工作日誌」)时出现乱码。

解决方法有两种:

  1. 强制 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 来处理字串与档案输出,避免乱码。

  2. 修改 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 在转换编码, 跟安装繁体中文语系套件有关吗?

修改