libiconv: 多语言编码处理转换

参考:

https://juejin.cn/post/7151385143880450078

https://www.gnu.org/software/libiconv/

1
2
3
4
5
6
7
8
9
10
11
12
# linux安装示例
cd /opt/ \
&& curl -C - -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz \
&& tar -zxvf libiconv-1.16.tar.gz \
&& cd libiconv-1.16/ \
&& ./configure --prefix=/usr/local/ \
&& sed -i -e '/gets is a security/d' ./srclib/stdio.in.h \
&& make \
&& make install \
&& ln -s /usr/local/lib/libiconv.so /usr/lib \
&& ln -s /usr/local/lib/libiconv.so.2 /usr/lib

添加中文环境

1
2
3
4
5
6
## 添加中文环境 centos Dockerfile
RUN yum -y install kde-l10n-Chinese \
&& yum clean all \
&& localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.utf8

字体缺失的问题

fontforge 可以创建合并字体

linux

1
2
3
4
# 字体缺失的问题, mscorefonts 提供一些基础字体
conda install -y fontconfig # mkfontscale 会被一起安装
fc-list # 查看系统已有字体
conda install -y mscorefonts # 安装一些基础字体

R

  1. extrafont::fonttable() 查看系统字体
  2. extrafont::fonts() 查看R中字体
  3. extrafont::font_import() 导入字体
  4. extrafont::loadfonts() 加载字体
  5. pdfFonts() 查看pdf支持的字体
1
2
3
# R语言有时需要导入字体,使用 extrafont
conda install -y r-extrafont && conda clean --all -y
R -e 'extrafont::font_import(paths = "/usr/local/fonts/", prompt = FALSE)' -e 'extrafont::loadfonts()'
1
2
3
4
5
6
7
8
9
10
# 有时导入了还报错,可能是pdf字体名不一致,检查一下
pdfFonts()
# 手动导入
sysfonts::font_add("Arial",
regular = file.path(FONT_LIB, "arial.ttf"),
bold = file.path(FONT_LIB, "arialbd.ttf"),
italic = file.path(FONT_LIB, "ariali.ttf"),
bolditalic = file.path(FONT_LIB, "arialbi.ttf")
)
showtext::showtext_auto(enable = TRUE)

python

  1. 使用 findSystemFonts 检查支持的字体文件
  2. 使用 fontManager.ttflist 检查已经加载的字体文件
  3. 如果支持的文件未加载,则需要删除 matplotlib.get_cachedir() 缓存文件夹,重新启动解释器加载。
  4. matplotlib 中的字体没有bold,因为有weight参数可以指定字体粗细,故只有normal和italic
1
2
3
4
5
6
import shutil
import matplotlib
import matplotlib.font_manager as fm
fm.findSystemFonts()
fm.fontManager.ttflist
shutil.rmtree(matplotlib.get_cachedir())
  1. 可以手动载入字体定义bold样式,但感觉必要性不大。
1
2
3
4
font_path = "xxx"
import matplotlib.font_manager as fm
font = fm.FontEntry(font_path, name='Times New Roman', style='bold', weight=700)
fm.fontManager.ttflist.insert(0, font)