| 参数 | 作用范围 | 说明 |
|---|---|---|
-Dfile.encoding=UTF-8 | Java程序内部字符编码(如 I/O 读写、字符串编码等) | 影响 InputStreamReader、OutputStreamWriter、日志、JSON 等操作 |
-Dsun.jnu.encoding=UTF-8 | 操作系统交互字符编码(如文件名、路径、系统参数) | 影响文件名中文乱码、路径处理等系统调用 |
java -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -jar yourapp.jar
CMD [“java”, “-Dfile.encoding=UTF-8”, “-Dsun.jnu.encoding=UTF-8”, “-jar”, “yourapp.jar”]
⚠️ 注意:这两个参数应 一起设置,否则可能一个编码 UTF-8,另一个仍为系统默认编码,导致混乱。
✅ 适用于哪些情况?
- Docker 容器(特别是 Alpine)运行 Java jar,遇到文件路径中包含中文
- Java 程序读取/写入带中文的文件路径、环境变量
- Windows 上处理中文文件名报错
| 情况 | 建议设置 |
|---|---|
| Java 程序中处理中文内容 | -Dfile.encoding=UTF-8 |
| 文件名/路径中包含中文 | -Dsun.jnu.encoding=UTF-8 |
| Docker/Alpine 环境 | 同时加两个参数最稳妥 |
sgerrand.rsa.pub下载的地址:https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk下载的地址:Release 2.29-r0 · sgerrand/alpine-pkg-glibc · GitHub
基于alpine:3.10基础镜像构建jdk容器,需要⚠️加上红字的内容,这些变量确保系统使用UTF-8编码处理中文字符
FROM alpine:3.10
MAINTAINER yunhaoz000@gmail.com
WORKDIR /java
ADD jdk-8u411-linux-x64.tar.gz /java
ADD sgerrand.rsa.pub /etc/apk/keys
COPY glibc* /java/
RUN echo "http://mirrors.aliyun.com/alpine/v3.10/main/" > /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.10/community/" >> /etc/apk/repositories \
&& apk update \
&& apk --no-cache add ca-certificates \
&& apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \
&& rm -rf /var/cache/apk/* glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \
&& ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
&& /usr/glibc-compat/bin/localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
ENV JAVA_HOME /java/jdk1.8.0_411
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN.UTF-8
ENV LC_ALL=zh_CN.UTF-8
CMD ["java", "-version"]
安装了完整的 glibc 支持并生成了中文 locale。Alpine 默认使用 musl libc,但许多 Java 应用和工具需要 glibc 的支持。
Categories:
docker与kubernetes