alpine 和 ubuntu 系统中文乱码问题

简介

最近在制作alpine的java镜像和Ubuntu的java镜像。输出的日志中的中文,以及附件等相关涉及中文的都变成问号,这是由于系统缺乏相应的编码文件导致,需要在系统里安装相应的中文编码,中文编码主要有zh_CN.gb18030、zh_CN.gbk、zh_CN.gbk2312、zh_CN.utf8。如果中文是gbk编码的,需要将变量LANG设置成gb18030或gbk编码,如果中文是utf8编码的需要LANG设置成utf-8编码。现将安装过程记录如下:

一、alpine系统中文问号乱码

【1】下载地址:

https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub

https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk

https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-bin-2.29-r0.apk

https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-i18n-2.29-r0.apk

【2】安装glibc

将sgerrand.rsa.pub 放到 /etc/apk/keys目录下,然后执行如下命令安装apk文件

bash 复制代码
apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk

【3】添加path变量

bash 复制代码
export PATH=/usr/glibc-compat/bin:$PATH

【4】使用localedef生成本地化配置

bash 复制代码
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
localedef -i zh_CN -f GBK zh_CN.GBK
localedef -i zh_CN -f GB18030 zh_CN.GB18030

【5】设置环境变量

bash 复制代码
export LANG=zh_CN.GB18030
export LANGUAGE="zh_CN:zh:en_US:en"
export LC_TIME="en_US.UTF8"

经过以上步骤以后,如果是GBK编码的中文就不会乱码了,如果是UTF8编码的话,就改成utf8的编码。LANG=zh_CN.UTF-8 。如果是制作dockerfile的话,参考代码如下:

bash 复制代码
FROM alpine:3.17
ENV LANG=zh_CN.GB18030
ENV LANGUAGE="zh_CN:zh:en_US:en"
ENV LC_TIME=en_US.UTF8
ENV PATH=$PATH:/usr/glibc-compat/bin:$JAVA_HOME/bin

COPY glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk /tmp
RUN mkdir -p /etc/apk/keys
COPY sgerrand.rsa.pub /etc/apk/keys
RUN    apk add --force-overwrite /tmp/glibc-2.29-r0.apk /tmp/glibc-bin-2.29-r0.apk /tmp/glibc-i18n-2.29-r0.apk \
    && rm -f /tmp/glibc-2.29-r0.apk /tmp/glibc-bin-2.29-r0.apk /tmp/glibc-i18n-2.29-r0.apk \
    && localedef -i en_US -f UTF-8 en_US.UTF-8 \
            && localedef -i zh_CN -f UTF-8 zh_CN.UTF-8 \
            && localedef -i zh_CN -f GBK zh_CN.GBK \
            && localedef -i zh_CN -f GB18030 zh_CN.GB18030

二、ubuntu中文问号乱码

【1】安装libgcc及语言包

bash 复制代码
apt-get update
apt-get -y install vim language-pack-zh-hans gcc libgcc-s1 libssl-dev

【2】本地化配置

bash 复制代码
 locale-gen zh_CN.GB18030
 locale-gen zh_CN.GBK
 locale-gen zh_CN.UTF-8
locale-gen en_US.UTF-8

【3】设置环境变量

bash 复制代码
export LANG=zh_CN.GB18030
export LANGUAGE="zh_CN:zh:en_US:en"
export LC_TIME=en_US.UTF8

经过以上步骤以后,如果是GBK编码的中文就不会乱码了,如果是UTF8编码的话,就改成utf8的编码。LANG=zh_CN.UTF-8 。如果是制作dockerfile的话,参考代码如下:

bash 复制代码
FROM ubuntu:22.04

ENV LANG=zh_CN.GB18030
ENV LANGUAGE="zh_CN:zh:en_US:en"
ENV LC_TIME=en_US.UTF8

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone


RUN     apt-get update \
        && apt-get -y install vim language-pack-zh-hans gcc libgcc-s1 libssl-dev \
        && locale-gen zh_CN.GB18030 \
        && locale-gen zh_CN.GBK \
        && locale-gen zh_CN.UTF-8 \
        && locale-gen en_US.UTF-8 \
        && rm /bin/sh \
        && ln -s /bin/bash /bin/sh \
        && apt-get -y autoremove \
        && echo "LC_TIME=en_US.UTF8" >>/etc/default/locale \
        && rm -rf /var/lib/apt/lists/*

三、系统语言环境确认

【1】alpine 系统下locale命令查看系统语言环境

没有执行本地化时,执行locale -a 命令是不会显示zh_CN.gb18030、zh_CN.gbk、zh_CN.gbk2312、zh_CN.utf8,如果系统中的中文是utf-8编码的话,需要将LANG改成zh_CN.utf8。

bash 复制代码
执行命令:locale
返回如下:
LANG=zh_CN.GB18030
LC_CTYPE="zh_CN.GB18030"
LC_NUMERIC="zh_CN.GB18030"
LC_TIME=en_US.UTF8
LC_COLLATE="zh_CN.GB18030"
LC_MONETARY="zh_CN.GB18030"
LC_MESSAGES="zh_CN.GB18030"
LC_PAPER="zh_CN.GB18030"
LC_NAME="zh_CN.GB18030"
LC_ADDRESS="zh_CN.GB18030"
LC_TELEPHONE="zh_CN.GB18030"
LC_MEASUREMENT="zh_CN.GB18030"
LC_IDENTIFICATION="zh_CN.GB18030"
LC_ALL=

执行命令:locale -a
返回如下:
C
C.utf8
en_US.utf8
POSIX
zh_CN.gb18030
zh_CN.gbk
zh_CN.gbk2312
zh_CN.utf8

【2】Ubuntu 系统下locale命令查看系统语言环境

没有执行本地化时,执行locale -a 命令是不会显示zh_CN.gb18030、zh_CN.gbk、zh_CN.gbk2312、zh_CN.utf8,如果系统中的中文是utf-8编码的话,需要将LANG改成zh_CN.utf8。

bash 复制代码
执行命令:
 sh-5.1# locale -a
C
C.utf8
en_US.utf8
POSIX
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_SG.utf8

执行命令:
sh-5.1# locale
LANG=zh_CN.GB18030
LANGUAGE=zh_CN:zh:en_US:en
LC_CTYPE="zh_CN.GB18030"
LC_NUMERIC="zh_CN.GB18030"
LC_TIME=en_US.UTF8
LC_COLLATE="zh_CN.GB18030"
LC_MONETARY="zh_CN.GB18030"
LC_MESSAGES="zh_CN.GB18030"
LC_PAPER="zh_CN.GB18030"
LC_NAME="zh_CN.GB18030"
LC_ADDRESS="zh_CN.GB18030"
LC_TELEPHONE="zh_CN.GB18030"
LC_MEASUREMENT="zh_CN.GB18030"
LC_IDENTIFICATION="zh_CN.GB18030"
LC_ALL=

【3】locale中各个变量的讲解

locale命令的详细用法参考:blog.fpliu.com/it/software/GNU/glibc/bin/locale

相关推荐
小白的码BUG之路4 小时前
linux -- ssh两台机器相连
运维·服务器·ssh
缓慢更新6 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
续写烂尾7 小时前
贴片 SD NAND、eMMC、TF 卡规格怎么定?硬件工程师选型清单
运维·服务器·网络
不昀7 小时前
网口Link Up后仍然掉线,怎样区分物理链路和数据通路问题?
linux·以太网
迪康妍妍7 小时前
终端管控实操:封堵网盘与IM外发通道的落地思路
运维·网络·安全·架构·安全性测试
sxgzzn7 小时前
如何选择合适的开关柜在线监测工具?
运维·重构·无人机·开关柜局放在线监测·光伏运维管理系统
Lhan.zzZ7 小时前
Qt WebEngineView 在 Linux 上无法加载网页:从“看不见 HTML“到“禁用沙箱“
linux·c++·qt
zxcvb1538 小时前
运维经验分享:监控网页更新内容的几种思路
运维
Fcy6488 小时前
Linux下 多路转接select详解
linux·select·多路转接
云飞云共享云桌面9 小时前
设计师共享单台图形服务器,解决 SolidWorks大装配卡顿难题
运维·服务器·3d·自动化·电脑·制造