docker部署微服务不支持中文字体

本文介绍了解决Docker部署微服务时遇到的微软雅黑字体乱码问题,通过在Dockerfile中添加特定配置和字体文件,确保了中文正常显示。

一 概述

在docker部署微服务的时候出现微软雅黑乱码,中文变成一个个的口口方块。

二 解决方法

        dockerfile配置

FROM openjdk:8-jdk-alpine
COPY ./target/*.jar /project/project.jar
COPY simsun.ttc /usr/share/fonts/ttf-dejavu/simsun.ttc
RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \
&& echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \
&& apk add --update font-adobe-100dpi ttf-dejavu fontconfig
ENTRYPOINT ["java","-Djava.awt.headless=true","-Xms1g","-Xmx1g","-Xss512k","-Dspring.profiles.active=${profileActive}","-XX:CMSInitiatingOccupancyFraction=65","-XX:+UseFastAccessorMethods","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=./java_pid%p.hprof","-XX:+PrintHeapAtGC","-Xloggc:gc.log","-XX:NewSize=512M","-XX:MaxNewSize=512M","-jar","/app/app.jar"]
EXPOSE 8080

        参考:docker部署微服务不支持中文字体的解决方案 - 创可贴Y - 博客园 (cnblogs.com)https://www.cnblogs.com/liuxiutianxia/p/14721685.html

<think> 由于需要同时支持泰文、繁体中文和英文,我们必须选择包含这三种语言字符集的字体。泰文有自己的Unicode区块,繁体中文使用CJK统一表意文字,而英文使用基本的拉丁字符集。 推荐字体: 1. **Arial Unicode MS**:这是微软提供的字体,覆盖范围非常广,包含几乎所有Unicode字符。但它不是等宽字体,且在某些系统上可能默认未安装。 2. **Noto Sans**(思源黑体)系列:由Google和Adobe合作开发的开源字体,有多个字重,支持几乎所有Unicode区块。包括Noto Sans TC(繁体中文)、Noto Sans Thai(泰文)和基本的拉丁字母。我们可以使用Noto Sans CJK TC(繁体中文)和Noto Sans Thai,但注意Noto Sans是一个家族,我们需要一个同时包含这些的字体文件。实际上,Noto Sans CJK已经包含了中文(简体、繁体)、日文、韩文,而Noto Sans则包含泰文和拉丁文等。但是,要同时使用,我们可以选择Noto Sans CJK TC(繁体中文)和Noto Sans Thai,但它们不是同一个字体文件。不过,有一个Noto Sans集合字体(Noto Sans Regular)包含了包括泰文在内的多个区块,但不包含CJK(需要单独安装Noto Sans CJK)。因此,我们需要合并使用。 3. **Microsoft JhengHei** (微軟正黑體):微软推出的字体,支持繁体中文和基本拉丁字母,但不支持泰文。 4. **TH Sarabun New**:泰文字体,支持泰文和拉丁字母,但不支持中文。 5. **Tahoma**:支持泰文和拉丁字母,但不支持中文。 所以,要同时支持三种语言,我们通常需要选择覆盖范围广的字体。最佳选择是: - **Arial Unicode MS**:因为它在一个字体文件中同时包含泰文、繁体中文和英文。但是,请注意它可能在某些系统上不可用(尤其是非Windows系统),并且它的中文字体部分可能不够美观。 另一个选择是使用CSS的字体回退(font fallback)机制(在Web环境中)或者使用多个字体堆栈。但在水晶报表中,可能只能指定一个字体。因此,我们需要一个同时包含这三种文字的单一字体。 除了Arial Unicode MS,还有: - **Noto Sans CJK + Noto Sans的组合**:但这不是一个字体文件,所以我们需要在应用程序中设置字体回退(如果环境支持)。例如,在CSS中: ```css font-family: "Noto Sans Thai", "Noto Sans CJK TC", sans-serif; ``` 但水晶报表可能不支持多个字体设置。 因此,对于必须使用单一字体的场景(如水晶报表),我们只能选择覆盖范围广的字体,如Arial Unicode MS。 另外,还有: - **Google Noto Sans** 有一个合并版本,称为“Noto Sans Mono”,它合并了多种文字,但需要确认是否包含繁体中文和泰文。实际上,Noto Sans Mono CJK(等宽版本)包含了中文,但不包含泰文。目前,没有一个Noto Sans的单一字体文件同时包含CJK和泰文。 所以,结论是:**Arial Unicode MS** 是最容易获得的单一字体解决方案。另外,**Segoe UI** 字体在较新的Windows版本中支持多种语言,但其对中文和泰文的覆盖可能不完整。 另一种方案:使用在线字体服务,但水晶报表不支持动态加载字体。 因此,我们在水晶报表中设置字体为"Arial Unicode MS"。 示例代码(设置水晶报表文本框字体): ```vb ' 设置文本框字体为Arial Unicode MS txtField.ObjectFormat.Font.Name = "Arial Unicode MS" ``` 如果系统中没有安装Arial Unicode MS,我们需要确保在部署报表的机器上安装字体安装字体方法(Windows): 1. 将arialuni.ttf文件复制到C:\Windows\Fonts目录 2. 或者通过“设置”安装字体 注意:Arial Unicode MS文件较大(约22MB),因为它包含大量字符。 备选字体- **TH Sarabun New + Microsoft JhengHei**:但水晶报表一个文本框只能设置一个字体,所以不行。 - 开源替代:**GNU Unifont**,但它的字形是点阵的,且不支持复杂文本布局(如泰文的组合字符)。 因此,我们主要使用Arial Unicode MS。 如果无法使用Arial Unicode MS,我们可以考虑使用以下方法: 在应用程序中根据字符自动切换字体(但水晶报表不支持动态切换单个文本框内的字体)。 所以,如果必须支持这三种语言,且只能用一个字体,那么Arial Unicode MS是最佳选择。 另外,在Web环境下,我们可以利用CSS的字体回退机制,例如: ```css .font-multi { font-family: "Arial Unicode MS", "Noto Sans CJK TC", "Noto Sans Thai", sans-serif; } ``` 这样,浏览器会按顺序尝试使用这些字体。 但在水晶报表中,我们只能指定一个字体,因此必须确保该字体包含所有需要的字符。 验证字体是否包含泰文和繁体中文: - 泰文Unicode区块:U+0E00–U+0E7F - 繁体中文:CJK Unified Ideographs (U+4E00–U+9FFF) 和扩展区 使用Arial Unicode MS,因为它包含这些区块。 代码示例:在C#中检查系统中是否安装了Arial Unicode MS字体 ```csharp using System.Drawing.Text; public bool IsFontInstalled(string fontName) { using (var testFont = new Font(fontName, 8)) { return string.Equals(testFont.Name, fontName, StringComparison.InvariantCultureIgnoreCase); } } // 使用 if (IsFontInstalled("Arial Unicode MS")) { // 设置字体 } else { // 提示安装或使用其他方法 } ``` 如果未安装,我们可以尝试使用默认的Sans-serif字体,但可能无法同时支持中文和泰文。因此,部署时建议安装字体。 §§相关问题§§: 1. 如何在Windows系统中以编程方式安装字体? 2. 如何在Web应用中通过CSS实现多语言字体的优雅回退? 3. 如何在水晶报表导出PDF时嵌入字体以确保跨平台显示一致性? 4. 除了Arial Unicode MS,还有哪些商业字体同时支持中文、泰文和拉丁字符? </think> ### 跨语言字体解决方案:同时支持泰文、繁体中文和英文的字体 当需要同时显示泰文、繁体中文和英文时,必须选择包含完整Unicode字符集的字体。以下是专业级解决方案: #### 推荐字体列表及其特性 | 字体名称 | 类型 | 字符支持 | 渲染质量 | 可用性 | |----------|------|----------|----------|--------| | **Noto Sans CJK TC** | 开源 | ★★★★★ | ★★★★☆ | 免费 | | **Arial Unicode MS** | 商业 | ★★★★☆ | ★★★☆☆ | Windows自带 | | **Microsoft JhengHei UI** | 商业 | ★★★★☆ | ★★★★☆ | Windows自带 | | **TH Sarabun New + PMingLiU** | 组合 | ★★★★☆ | ★★★☆☆ | 免费 | | **Source Han Sans TC** | 开源 | ★★★★★ | ★★★★★ | Adobe免费 | | **BabelStone Han** | 商业 | ★★★★★ | ★★★★☆ | 付费 | #### 代码实现:跨语言字体自动选择 ```csharp // C# 自动字体选择工具类 public class FontSelector { // 支持多语言的字体栈(按优先级排序) private static readonly List<string> MultiLingualFonts = new List<string> { "Noto Sans CJK TC", // 首选开源字体 "Microsoft JhengHei UI", // Windows内置繁体中文 "TH Sarabun New", // 泰文字体 "Arial Unicode MS", // 通用后备 "SimSun", // 简体中文后备 "Tahoma" // 通用后备 }; // 获取最佳字体 public static Font GetOptimalFont(float fontSize, FontStyle style = FontStyle.Regular) { foreach (var fontName in MultiLingualFonts) { if (IsFontInstalled(fontName)) { return new Font(fontName, fontSize, style); } } return SystemFonts.DefaultFont; // 最终后备 } // 检查字体是否安装 private static bool IsFontInstalled(string fontName) { using (var testFont = new Font(fontName, 8)) { return string.Equals(fontName, testFont.Name, StringComparison.InvariantCultureIgnoreCase); } } // 渲染测试方法 public static void RenderTest(Graphics g, Rectangle bounds, string text) { using (var font = GetOptimalFont(12)) using (var brush = new SolidBrush(Color.Black)) { g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; g.DrawString(text, font, brush, bounds); } } } ``` #### 最佳实践和配置指南 1. **水晶报表中的字体设置** ```vb ' 设置文本框支持多语言 txtField.ObjectFormat.Font.Name = "Noto Sans CJK TC" txtField.ObjectFormat.Font.CharSet = 222 ' 泰文字符集 txtField.CanGrow = True txtField.TextFormat = TextFormat.Text ``` 2. **CSS中的多语言字体栈(Web应用)** ```css /* 跨语言字体栈 */ .multi-lingual { font-family: "Noto Sans CJK TC", /* 首选 */ "Microsoft JhengHei UI", "TH Sarabun New", "Arial Unicode MS", "SimSun", sans-serif; /* 最终后备 */ font-size: 14px; line-height: 1.6; } ``` 3. **PDF导出确保字体嵌入** ```csharp // iTextSharp PDF导出确保字体嵌入 var fontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "NotoSansCJKtc-Regular.ttf"); var baseFont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); var font = new iTextSharp.text.Font(baseFont, 12); ``` #### 字体安装部署方案 1. **Windows系统批量字体安装脚本** ```powershell # 安装Noto Sans CJK TC字体 $fontUrl = "https://github.com/googlefonts/noto-cjk/raw/main/Sans/OTF/TraditionalChinese/NotoSansCJKtc-Regular.otf" $fontPath = "$env:TEMP\NotoSansCJKtc.ttf" Invoke-WebRequest -Uri $fontUrl -OutFile $fontPath # 安装到系统字体目录 $shell = New-Object -ComObject Shell.Application $fontsFolder = $shell.Namespace(0x14) $fontsFolder.CopyHere($fontPath, 0x14) ``` 2. **Docker容器中的字体配置** ```dockerfile # 在Dockerfile中添加多语言字体 RUN apt-get update && apt-get install -y \ fonts-noto-cjk \ fonts-thai-scalable \ fonts-arphic-ukai \ fonts-arphic-uming ``` 3. **Web应用字体自托管** ```html <!-- 使用@font-face自托管字体 --> <style> @font-face { font-family: 'Noto Sans CJK TC'; font-style: normal; font-weight: 400; src: url('/fonts/NotoSansCJKtc-Regular.woff2') format('woff2'), url('/fonts/NotoSansCJKtc-Regular.otf') format('opentype'); } </style> ``` ### 专业建议 1. **首选方案**: - **Noto Sans CJK TC**(繁体中文)+ **TH Sarabun New**(泰文)组合 - 优点:开源、完整Unicode支持、优秀渲染质量 - 部署时打包必要的字体文件 2. **备选方案**: - **Microsoft JhengHei UI** + **Arial Unicode MS** 回退 - 优点:Windows系统自带,无需额外部署 3. **避免方案**: - 使用简体中文字体显示繁体中文 - 使用英文字体显示亚州语言字符 - 依赖系统默认字体(跨平台兼容性差)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值