【Docker】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案

@TOC

一、容器中Spring boot项目 Graphics2D 画图中文乱码解决方案

在 Docker 容器中运行 Java 应用使用 Graphics2D 绘制中文时出现乱码,通常是因为容器缺少中文字体支持。以下是完整的解决方案:

1. 基础解决方案:安装中文字体

方法一:基于 Alpine 镜像的解决方案

FROM openjdk:8-jdk-alpine

# 安装中文字体
RUN apk add --update ttf-dejavu fontconfig && \
    rm -rf /var/cache/apk/*

COPY your-app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

方法二:基于 Ubuntu/Debian 镜像的解决方案(推荐

FROM openjdk:8-jdk

# 安装中文字体
RUN apt-get update && \
    apt-get install -y fonts-wqy-zenhei && \
    rm -rf /var/lib/apt/lists/*

COPY your-app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

2. 高级解决方案:自定义字体

方法一:将本地字体复制到容器中

FROM openjdk:8-jdk

# 创建字体目录
RUN mkdir -p /usr/share/fonts/custom

# 复制本地字体文件到容器
COPY ./fonts/*.ttf /usr/share/fonts/custom/

# 刷新字体缓存
RUN apt-get update && \
    apt-get install -y fontconfig && \
    fc-cache -fv && \
    rm -rf /var/lib/apt/lists/*

COPY your-app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

方法二:使用现有字体文件

FROM openjdk:8-jdk

# 下载并安装思源黑体
RUN apt-get update && \
    apt-get install -y wget && \
    wget -O /tmp/source-han-sans.zip https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SourceHanSansSC.zip && \
    unzip /tmp/source-han-sans.zip -d /usr/share/fonts/ && \
    rm /tmp/source-han-sans.zip && \
    apt-get remove -y wget && \
    apt-get install -y fontconfig && \
    fc-cache -fv && \
    rm -rf /var/lib/apt/lists/*

COPY your-app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

3. Java 代码中指定字体

确保你的 Java 代码中正确指定了可用字体:

// 列出所有可用字体
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontNames = ge.getAvailableFontFamilyNames();
System.out.println("可用字体: " + Arrays.toString(fontNames));

// 使用特定字体
Font font = new Font("文泉驿正黑", Font.PLAIN, 12);
// 或者
Font font = new Font("Source Han Sans SC", Font.PLAIN, 12);
// 或者
Font font = new Font("SimHei", Font.PLAIN, 12);

g2d.setFont(font);

4. 验证字体是否安装成功

进入容器检查字体是否安装正确:

docker exec -it your-container-name bash
fc-list :lang=zh

5. 常见问题排查

  1. 字体未生效

    • 确保容器中确实安装了字体
    • 检查 Java 代码中指定的字体名称是否完全匹配
  2. 字体缓存问题

    # 在容器中执行
    fc-cache -fv
    
  3. 字体权限问题

    • 确保字体文件有正确的读取权限

推荐方案组合

  1. 使用 Ubuntu/Debian 基础镜像
  2. 安装 fonts-wqy-zenheittf-wqy-zenhei
  3. 在 Java 代码中明确指定字体名称
  4. 构建镜像后验证字体是否可用

这样通常可以解决 Docker 容器中 Graphics2D 绘制中文乱码的问题。

二、Ubuntu 安装常见中文字体指南

在 Ubuntu 系统上安装中文字体可以解决文档显示、图形渲染和应用程序中的中文乱码问题。以下是常见中文字体的安装方法。

1. 安装常用开源中文字体包

文泉驿系列字体

sudo apt update
sudo apt install fonts-wqy-zenhei  # 文泉驿正黑
sudo apt install fonts-wqy-microhei  # 文泉驿微米黑

Noto 系列字体 (Google 提供)

sudo apt install fonts-noto-cjk  # 包含简体中文、繁体中文、日文和韩文字体

思源系列字体 (Adobe 和 Google 合作)

sudo apt install fonts-source-han-sans  # 思源黑体
sudo apt install fonts-source-han-serif  # 思源宋体

2. 安装其他流行中文字体

微软核心字体 (包括宋体、黑体等)

sudo apt install ttf-mscorefonts-installer
sudo fc-cache -fv  # 更新字体缓存

方正字体 (需手动安装)

  1. 下载方正字体文件 (.ttf)
  2. 复制到系统字体目录:
sudo cp *.ttf /usr/share/fonts/
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

3. 查看已安装的中文字体

# 查看所有已安装的中文字体
fc-list :lang=zh

# 查看特定字体族
fc-list | grep "WenQuanYi"
fc-list | grep "Noto Sans CJK"

4. 安装完整字体包 (推荐)

# 安装常用中文字体合集
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk fonts-arphic-ukai fonts-arphic-uming

5. 手动安装字体文件

  1. 创建本地字体目录:
mkdir -p ~/.local/share/fonts
  1. 将下载的 .ttf 或 .otf 字体文件复制到此目录

  2. 更新字体缓存:

fc-cache -fv

6. 验证字体安装

# 检查特定字体是否可用
fc-match "WenQuanYi Zen Hei"
fc-match "Noto Sans CJK SC"

推荐字体组合

对于大多数中文显示需求,建议安装以下组合:

sudo apt install fonts-noto-cjk fonts-wqy-zenhei fonts-arphic-ukai fonts-arphic-uming

注意事项

  1. 安装后可能需要重启应用程序才能看到新字体
  2. 某些专业字体可能需要购买授权
  3. 系统级安装需要 root 权限,用户级安装只需放在 ~/.local/share/fonts/
  4. 使用 fc-cache -fv 命令更新字体缓存

这些字体安装后,大多数中文显示问题都能得到解决,包括终端、办公软件、图形界面和开发工具中的中文显示。

你可能感兴趣的:(日常工作总结,docker,spring,boot,容器)