V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
OnlyJack
V2EX  ›  Linux

字符集问题讨论

  •  
  •   OnlyJack · 2 天前 · 1009 次点击

    版本 spring boot 2.7.18 jdk version 1.8

    问题:ECS 启动 打印的日志有中文 无乱码情况,到容器运行之后 竟然出现了部分中文乱码,详细把基础镜像、业务镜像都拆分了一遍 专门加上 LANG=en_US.UTF-8 ,仍然无用 包括在 k8s yaml 都增加了环境变量 依然显示 LANG=C.utf8 ,最终发现是通过阿里云控制台登录容器终端,字符集确实是有问题 通过 kubectl exec 进去之后,显示字符集是没问题的,但 java 服务启动依然会有部分中文乱码。

    大佬们,请把你们的解决方案放在评论区~

    18 条回复    2025-11-14 17:25:10 +08:00
    dode
        1
    dode  
       2 天前
    吃瓜
    OnlyJack
        2
    OnlyJack  
    OP
       2 天前
    @dode 好瓜
    Dorathea
        3
    Dorathea  
       2 天前
    不用中文日志, 不折腾...
    OnlyJack
        4
    OnlyJack  
    OP
       2 天前
    @Dorathea 大佬说得对,但是项目运行之后 一些落库的 含有中文,也会有乱码情况
    dode
        5
    dode  
       2 天前
    使用 debian 、ubuntu 容器镜像,安装中文语言包,部署启动应用服务
    OnlyJack
        6
    OnlyJack  
    OP
       2 天前
    @dode 在基础镜像 尝试了,无用 仍然会乱码~
    midsolo
        7
    midsolo  
       2 天前
    有排除疑难杂症的时间,不如构建一个支持中文的 ubuntu 镜像。

    FROM ubuntu:20.04
    RUN apt-get update && \
    apt-get install -y language-pack-zh-hans locales && \
    locale-gen zh_CN.UTF-8 && \
    update-locale LANG=zh_CN.UTF-8
    ENV LANG=zh_CN.UTF-8
    ENV LC_ALL=zh_CN.UTF-8
    julyclyde
        8
    julyclyde  
       2 天前   ❤️ 1
    应该是你没明白环境变量的传播关系导致的
    我猜你说的“专门加上”是加在 bashrc 甚至.bash_profile 里了
    shuangbiaog
        9
    shuangbiaog  
       2 天前
    有没有检查 jvm 启动参数和日志框架配置呢
    runliuv
        10
    runliuv  
       2 天前
    java -Dfile.encoding=utf-8 。
    要么控制台有乱码,要么 TXT 日志有乱码。反正 2 者乱一样儿。
    OnlyJack
        11
    OnlyJack  
    OP
       2 天前
    @midsolo 是的 构建了,依然不行哦 尝试过了的
    OnlyJack
        12
    OnlyJack  
    OP
       2 天前
    @julyclyde 对 其实和环境变量没啥太大关系
    vvtf
        13
    vvtf  
       2 天前
    java 没特别设置的不会是乱码, 你可以把日志拉到本地看下是不是 utf8 格式的.
    所以大概率就是终端的乱码.
    需要 exec -ti 进入容器时设置一下 LANG 试试.
    OnlyJack
        14
    OnlyJack  
    OP
       2 天前
    @shuangbiaog 加的都挺全了,依然是部分中文乱码

    -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -Dspring.http.encoding.charset=UTF-8 -Dspring.http.encoding.enabled=true -Dspring.messages.encoding=UTF-8
    OnlyJack
        15
    OnlyJack  
    OP
       2 天前
    @vvtf exec -it 容器内是 LANG=en_US.UTF-8
    OnlyJack
        16
    OnlyJack  
    OP
       2 天前   ❤️ 1
    感谢各位大佬~ 实际上的问题出在 java 项目上,在编译的过程中 父 pom 没有指定 utf-8 导致的,包括子 pom 和运行过程中导致的。

    其实这个相当于 java 项目不规范导致的,理论上都要增加 utf-8 并且要设置为全局。

    父 pom 配置
    <!-- 设置项目编码为 UTF-8 ,解决编译和运行时的中文乱码问题 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>


    子 pom 配置
    <encoding>UTF-8</encoding>


    WebApplication.java

    // 设置系统默认编码为 UTF-8 ,解决容器环境中文乱码问题
    // 必须在 Spring Boot 启动之前设置,确保日志输出使用正确的编码
    System.setProperty("file.encoding", "UTF-8");
    System.setProperty("sun.jnu.encoding", "UTF-8");
    julyclyde
        17
    julyclyde  
       2 天前
    @OnlyJack exec 那是 non login shell 的
    和 java 进程的环境变量是两码事
    OnlyJack
        18
    OnlyJack  
    OP
       2 小时 45 分钟前
    @julyclyde 是的,只是这么阐述~~~
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2643 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 12:11 · PVG 20:11 · LAX 04:11 · JFK 07:11
    ♥ Do have faith in what you're doing.