nextjs + sharp在 vercel 环境svg转png出现中文乱码

2023-12-21 03:52

本文主要是介绍nextjs + sharp在 vercel 环境svg转png出现中文乱码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前一篇博客 Next.js和sharp实现占位图片生成工具,详细介绍了使用 Next.js + sharp + Vercel 来实现一个 占位图片生成工具,遇到一个奇怪的问题:在本地开发环境,英文、数字、中文字符自定义内容,都能正常渲染。但是发布到 Vercel 生产环境,自定义内容除了英文字符和数字外,中文字符 显示为 Unicode 码位(乱码),如下图所示。

svg转png中文乱码

问题原因

经过排查,发现是 sharp 库在 vercel 生产环境下,对 svgpng 时,中文字符 会出现乱码。而在本地开发环境,sharp 库对 svgpng 时,中文字符 不会出现乱码。
vercel 平台查看 log 日志,发现了错误提示:Fontconfig error: No writable cache directories
进一步定位,说明是 vercel 容器环境没有支持中文的字体,因此无法正常渲染中文字符。

解决方案

  1. nextjs 项目根目录下,创建 fonts 文件夹,将中文字体文件 NotoSansSC-Regular.ttf 放入 fonts 文件夹中。我这里使用的是 NotoSansSC-Regular.ttf 字体,支持简体中文字符。下载地址:https://github.com/notofonts/noto-cjk
  2. fonts 文件夹下,创建 fonts.conf 文件,内容如下:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig><dir>/var/task/fonts/</dir><cachedir>/tmp/fonts-cache/</cachedir><config></config>
</fontconfig>
  1. sharp 处理 svgpng 函数所在文件的头部加入如下代码:
resolve(process.cwd(), 'fonts', 'fonts.conf')
resolve(process.cwd(), 'fonts', 'NotoSansSC-Regular.ttf')
  1. 在项目根目录下创建一个 .env 环境变量文件,内容如下:
FONTCONFIG_PATH=/var/task/fonts
  1. svg 中设置 font-family,如下:
function getSvgBuffer({ w, h, bg, color, size, text }) {let textY = (+h + size / 2) / 2let svg = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs"width="${w}" height="${h}"><rect width="${w}" height="${h}"fill="${bg}" style="fill:${bg};"/><text x="50%" y="${textY}" style="font-family: 'Noto Sans', 'Noto Sans SC', sans-serif;"dominant-baseline="alphabetic" text-anchor="middle" stroke="none" stroke-width="0" font-size="${size}" fill="${color}" fill-opacity="1">${text}</text>
</svg>`svg = '<?xml version="1.0" encoding="UTF-8"?>' + svgreturn Buffer.from(svg, 'utf-8')
}
  1. vercel 平台上配置环境变量 FONTCONFIG_PATH,值为 /var/task/fonts

FONTCONFIG_PATH

  1. 再次发布到 vercel 平台,问题解决。

参考文档:

  • https://sharp.pixelplumbing.com/install#fonts
  • https://github.com/lovell/sharp/issues/3698
  • https://github.com/lovell/sharp/issues/1875

欢迎访问:天问博客

这篇关于nextjs + sharp在 vercel 环境svg转png出现中文乱码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518556

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads