Linux字符集引发的bug

在进行服务器迁移时,处理文档的功能出现了一个匪夷所思的bug。处理过的文档中的中文字符都变成了一个个小方框,如下图所示:

image-20231114005123073

由于这个问题影响了在线上环境的用户体验,为了尽量保证服务质量,我紧急切换了该接口的地址到旧服务器,并着手修复这个bug。

分析

首先,我们需要分析问题出现的原因。通过观察乱码和正常显示的英文,可以初步推测问题是与中文字符有关。在本地环境没有任何问题,但在服务器上出现了乱码,这让我们可以初步确认是由于Linux中缺少WPS中用到的一些中文字体导致的文档处理后的乱码问题。

处理思路

  • 安装字体文件: 需要在Linux中安装缺失的字体文件。
  • 字体来源: 需要确定字体文件从何处获取。
  • 字体安装与启用: 怎样在Linux中安装字体文件并启用。

Bug处理

复制Windows系统字体

通常情况下,使用Ubuntu 16.04系统的计算机都安装了双系统,因此可以直接在Ubuntu系统中进行字体复制。如果计算机仅安装了Ubuntu系统,需要找一台安装了Windows系统的电脑将字体复制过来。Windows系统的字体目录通常位于:C:\Windows\Fonts。需要注意,该目录包含三种后缀的文件:.fon,.ttf,.ttc,我们只需要复制.ttf和.ttc后缀的文件。

image-20231114011204231

# 在/usr/share/fonts/下新建目录:win_fonts
sudo mkdir /usr/share/fonts/win_fonts
# 将Windows系统Fonts目录里的.ttf和.ttc后缀的文件全部复制到Ubuntu系统
sudo cp /media/david/OS/Windows/Fonts/*.{ttf,ttc} /usr/share/fonts/win_fonts
# 删除.fon文件
sudo rm -f /usr/share/fonts/win_fonts/*.fon

生成字体的索引信息

bashCopy codesudo mkfontscale
sudo mkfontdir

如果出现命令无效的问题,可能需要安装相应的软件包。可以使用以下命令安装字体管理工具:

bashCopy code
sudo yum install fontconfig xorg-x11-font-utils

更新字体缓存

bashCopy code
sudo fc-cache

最后,重新启动服务,问题得到解决。

安装字体文件的验证

在复制完Windows系统字体并生成索引信息后,为了确保字体已经成功安装,可以使用以下命令查看新安装的字体是否被正确识别:

bashCopy code
fc-list | grep win_fonts

这将列出所有与 win_fonts 相关的字体信息,以确保它们已经被系统正确加载。

解决字体无效问题

如果在文档处理后仍然存在中文字符乱码问题,可能是字体配置出现了一些问题。可以检查文档处理服务的配置文件,确保它正确引用了新安装的字体。

配置文件通常位于 /etc 目录下,具体路径可能因系统和服务而异。查找服务的配置文件,并确认其中的字体配置是否正确。

字体文件备份

在进行字体替换和更新之前,强烈建议备份现有的字体文件,以防出现意外情况。可以使用以下命令创建字体文件的备份:

bashCopy code
sudo cp -r /usr/share/fonts/win_fonts /usr/share/fonts/win_fonts_backup

这样,在需要恢复时,可以通过将备份文件复制回字体目录来还原原始状态。

日志查看

如果问题仍然存在,可以查看文档处理服务的日志文件,以便获取更多详细信息。通常,服务的日志文件位于 /var/log 目录下。使用以下命令查看最近的服务日志:

bashCopy code
sudo cat /var/log/document_service.log

根据日志中的错误或警告信息,可以更准确地定位问题并采取相应的解决措施。