Linux locale命令 详解

locale命令用于查看和设置Linux系统的区域设置(locale),这些设置决定了系统的语言、字符编码、货币格式、时间格式等本地化信息。

locale简介

什么是locale?

locale是Linux系统中用于定义语言、地区、字符编码等本地化信息的配置。它影响:

  • 系统显示语言
  • 字符编码(如UTF-8)
  • 日期时间格式
  • 货币符号和格式
  • 数字和排序规则
  • 消息和错误提示语言
locale命名规则

locale名称的格式通常为:

语言_地区.字符集@修饰符

  • zh_CN.UTF-8 - 中文(中国),UTF-8编码
  • en_US.UTF-8 - 英文(美国),UTF-8编码
  • ja_JP.UTF-8 - 日文(日本),UTF-8编码
  • fr_FR.UTF-8 - 法文(法国),UTF-8编码

基本命令

命令 说明
locale 查看当前locale设置
locale -a 查看系统支持的所有locale
locale -m 查看系统支持的所有字符集
locale -k 关键字 查看指定locale的详细信息
localectl 系统区域设置控制工具(systemd)
locale-gen 生成locale(Debian/Ubuntu)
update-locale 更新locale配置(Debian/Ubuntu)
基本命令示例
# 1. 查看当前locale设置(最常用)
locale

# 输出示例:
# LANG=zh_CN.UTF-8
# LC_CTYPE="zh_CN.UTF-8"
# LC_NUMERIC="zh_CN.UTF-8"
# LC_TIME="zh_CN.UTF-8"
# LC_COLLATE="zh_CN.UTF-8"
# LC_MONETARY="zh_CN.UTF-8"
# LC_MESSAGES="zh_CN.UTF-8"
# LC_PAPER="zh_CN.UTF-8"
# LC_NAME="zh_CN.UTF-8"
# LC_ADDRESS="zh_CN.UTF-8"
# LC_TELEPHONE="zh_CN.UTF-8"
# LC_MEASUREMENT="zh_CN.UTF-8"
# LC_IDENTIFICATION="zh_CN.UTF-8"
# LC_ALL=

# 2. 查看系统支持的所有locale
locale -a

# 3. 查看系统支持的所有字符集
locale -m

# 4. 查看特定locale的详细信息
locale -k LC_CTYPE
locale -k LC_TIME

# 5. 查看特定locale的所有信息
LANG=zh_CN.UTF-8 locale -k LC_TIME

# 6. 显示locale的字符映射表
locale charmap

# 7. 显示当前语言的月份名称
locale month

# 8. 显示当前语言的星期名称
locale day

locale环境变量

环境变量 说明 示例值
LANG 默认区域设置(其他未设置变量的默认值) zh_CN.UTF-8
LC_ALL 最高优先级,覆盖所有其他locale设置 en_US.UTF-8
LC_CTYPE 字符分类和大小写转换 zh_CN.UTF-8
LC_NUMERIC 数字格式(小数点、千分位) en_US.UTF-8
LC_TIME 时间和日期格式 zh_CN.UTF-8
LC_COLLATE 排序和比较规则 en_US.UTF-8
LC_MONETARY 货币格式 zh_CN.UTF-8
LC_MESSAGES 系统消息语言 zh_CN.UTF-8
LC_PAPER 纸张大小标准 zh_CN.UTF-8
LC_NAME 姓名格式 zh_CN.UTF-8
LC_ADDRESS 地址格式 zh_CN.UTF-8
LC_TELEPHONE 电话号码格式 zh_CN.UTF-8
LC_MEASUREMENT 度量单位 zh_CN.UTF-8
LC_IDENTIFICATION locale元数据 zh_CN.UTF-8
环境变量优先级:

LC_ALL > LC_* > LANG

如果设置了LC_ALL,它将覆盖所有其他locale设置。如果LC_ALL未设置,则使用对应的LC_*变量,如果LC_*也未设置,则使用LANG的值。

生成locale

为系统添加新的locale

如果locale -a中没有需要的locale,需要先生成:

Debian/Ubuntu系统:
# 1. 编辑locale配置文件
sudo vi /etc/locale.gen

# 2. 取消注释需要的locale
# 例如,启用中文支持:
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
en_US.UTF-8 UTF-8

# 3. 生成locale
sudo locale-gen

# 4. 更新系统locale
sudo update-locale LANG=zh_CN.UTF-8

# 5. 查看生成的locale
locale -a | grep zh_CN
CentOS/RHEL/Fedora系统:
# 1. 查看可用的locale
localectl list-locales

# 2. 设置系统locale
sudo localectl set-locale LANG=zh_CN.UTF-8

# 3. 生成特定locale
sudo localedef -i zh_CN -f UTF-8 zh_CN.UTF-8

# 4. 或者编辑配置文件
sudo vi /etc/locale.conf
# 添加:LANG="zh_CN.UTF-8"

# 5. 使配置生效
source /etc/locale.conf
通用方法(所有系统):
# 1. 手动生成locale
sudo locale-gen zh_CN.UTF-8

# 2. 或者使用localedef
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8

# 3. 验证是否生成成功
locale -a | grep zh_CN

# 4. 临时设置locale(仅当前会话)
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

配置系统locale

永久配置系统locale
方法1:编辑配置文件(推荐)
# 1. 编辑全局locale配置文件
sudo vi /etc/default/locale     # Debian/Ubuntu
sudo vi /etc/locale.conf        # CentOS/RHEL/Fedora
sudo vi /etc/sysconfig/i18n     # 旧版RHEL

# 2. 添加以下内容
LANG="zh_CN.UTF-8"
LC_ALL="zh_CN.UTF-8"

# 3. 或者只设置LANG(推荐)
LANG="zh_CN.UTF-8"

# 4. 使配置生效
source /etc/default/locale      # 当前会话生效
# 重启后永久生效
方法2:使用localectl命令(systemd系统)
# 1. 查看当前系统locale设置
localectl status

# 2. 设置系统locale
sudo localectl set-locale LANG=zh_CN.UTF-8

# 3. 设置特定locale
sudo localectl set-locale LC_CTYPE=zh_CN.UTF-8
sudo localectl set-locale LC_TIME=en_US.UTF-8

# 4. 同时设置多个
sudo localectl set-locale LANG=zh_CN.UTF-8 LC_CTYPE=zh_CN.UTF-8 LC_TIME=en_US.UTF-8

# 5. 查看生效的配置
localectl
方法3:用户级locale配置
# 1. 编辑用户shell配置文件
vi ~/.bashrc        # bash用户
vi ~/.zshrc         # zsh用户
vi ~/.profile       # 所有shell

# 2. 添加以下行
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 3. 使配置生效
source ~/.bashrc

# 4. 验证配置
locale
echo $LANG

常用locale列表

中文locale
  • zh_CN.UTF-8 - 简体中文,UTF-8编码(推荐)
  • zh_CN.GBK - 简体中文,GBK编码
  • zh_CN.GB2312 - 简体中文,GB2312编码
  • zh_CN.GB18030 - 简体中文,GB18030编码
  • zh_TW.UTF-8 - 繁体中文(台湾)
  • zh_HK.UTF-8 - 繁体中文(香港)
  • zh_SG.UTF-8 - 简体中文(新加坡)
英文及其他locale
  • en_US.UTF-8 - 英文(美国),UTF-8编码
  • en_GB.UTF-8 - 英文(英国)
  • en_AU.UTF-8 - 英文(澳大利亚)
  • ja_JP.UTF-8 - 日文(日本)
  • ko_KR.UTF-8 - 韩文(韩国)
  • fr_FR.UTF-8 - 法文(法国)
  • de_DE.UTF-8 - 德文(德国)
  • ru_RU.UTF-8 - 俄文(俄罗斯)
关于C/POSIX locale:

CPOSIX是默认的最小locale,使用ASCII字符集,是最基本的配置。许多服务器为了性能和兼容性使用C locale。

实战示例

示例1:解决中文乱码问题
#!/bin/bash
# 解决中文乱码问题
# 文件名:fix_chinese_locale.sh

echo "正在检查当前locale设置..."
locale

echo -e "\n检查是否支持中文locale..."
locale -a | grep -E "zh_CN|zh_TW|zh_HK"

# 如果未安装中文locale,尝试安装
if ! locale -a | grep -q "zh_CN.UTF-8"; then
    echo "未找到中文locale,尝试安装..."

    # 检测系统类型
    if [ -f /etc/debian_version ]; then
        # Debian/Ubuntu系统
        echo "安装中文locale(Debian/Ubuntu)..."
        sudo sed -i '/zh_CN.UTF-8/s/^#//g' /etc/locale.gen
        sudo locale-gen
        sudo update-locale LANG=zh_CN.UTF-8
    elif [ -f /etc/redhat-release ]; then
        # CentOS/RHEL/Fedora系统
        echo "安装中文locale(CentOS/RHEL)..."
        sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
        sudo localectl set-locale LANG=zh_CN.UTF-8
    fi
fi

echo -e "\n临时设置中文locale(当前会话有效)..."
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

echo -e "\n永久设置中文locale..."
if [ -f ~/.bashrc ]; then
    echo "写入 ~/.bashrc"
    echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc
    echo 'export LC_ALL=zh_CN.UTF-8' >> ~/.bashrc
fi

echo -e "\n重新加载配置..."
source ~/.bashrc 2>/dev/null || true

echo -e "\n验证设置..."
locale
echo -e "\n测试中文显示:"
echo "中文测试" | iconv -f UTF-8 -t GBK 2>/dev/null || echo "无法转换编码"

echo -e "\n完成!如果仍有乱码,请重启终端或系统。"
示例2:批量设置服务器locale
#!/bin/bash
# 批量设置服务器locale
# 文件名:batch_set_locale.sh

# 服务器列表
SERVERS=("server1.example.com" "server2.example.com" "server3.example.com")
USER="root"
LOCALE="en_US.UTF-8"

echo "开始批量设置服务器locale为: $LOCALE"

for SERVER in "${SERVERS[@]}"; do
    echo -e "\n===== 处理服务器: $SERVER ====="

    # 检查服务器连通性
    if ! ping -c 1 -W 2 "$SERVER" &> /dev/null; then
        echo "服务器 $SERVER 不可达,跳过"
        continue
    fi

    # SSH连接并执行命令
    ssh -o ConnectTimeout=5 "$USER@$SERVER" "
        echo '当前locale设置:'
        locale

        echo -e '\n正在设置locale...'

        # 检查系统类型并设置
        if [ -f /etc/debian_version ]; then
            # Debian/Ubuntu
            sed -i '/$LOCALE/s/^#//g' /etc/locale.gen 2>/dev/null || true
            locale-gen 2>/dev/null || true
            update-locale LANG=$LOCALE 2>/dev/null || true
        elif [ -f /etc/redhat-release ]; then
            # CentOS/RHEL/Fedora
            localectl set-locale LANG=$LOCALE 2>/dev/null || true
            echo 'LANG=$LOCALE' > /etc/locale.conf 2>/dev/null || true
        fi

        # 临时设置当前会话
        export LANG=$LOCALE
        export LC_ALL=$LOCALE

        echo -e '\n设置后的locale:'
        locale

        echo -e '\n重启后生效,建议重启相关服务。'
    " 2>&1 | sed "s/^/[$SERVER] /"

    if [ ${PIPESTATUS[0]} -eq 0 ]; then
        echo "服务器 $SERVER 设置成功"
    else
        echo "服务器 $SERVER 设置失败"
    fi
done

echo -e "\n批量设置完成"
示例3:检查和修复损坏的locale
#!/bin/bash
# 检查和修复损坏的locale
# 文件名:check_fix_locale.sh

echo "========== 检查locale配置 =========="

# 检查当前设置
echo "1. 当前locale设置:"
locale 2>&1 | tee /tmp/locale_check.log

# 检查是否有错误
echo -e "\n2. 检查错误信息:"
if locale 2>&1 | grep -q "warning\|error\|Cannot set"; then
    echo "发现locale错误,开始修复..."

    # 备份现有配置
    echo "备份当前配置..."
    cp /etc/default/locale /etc/default/locale.bak 2>/dev/null || true
    cp /etc/locale.conf /etc/locale.conf.bak 2>/dev/null || true
    cp ~/.bashrc ~/.bashrc.bak 2>/dev/null || true

    # 生成基本locale
    echo "生成基本locale..."
    locale-gen en_US.UTF-8 2>/dev/null || true
    locale-gen C.UTF-8 2>/dev/null || true

    # 重置为简单配置
    echo "重置locale配置..."
    echo "LANG=en_US.UTF-8" | sudo tee /etc/default/locale > /dev/null 2>&1 || true
    echo "LANG=en_US.UTF-8" | sudo tee /etc/locale.conf > /dev/null 2>&1 || true

    # 清理用户配置中的错误行
    if [ -f ~/.bashrc ]; then
        echo "清理 ~/.bashrc 中的locale设置..."
        sed -i '/export LANG=/d' ~/.bashrc
        sed -i '/export LC_/d' ~/.bashrc
        sed -i '/export LC_ALL=/d' ~/.bashrc
        echo 'export LANG=en_US.UTF-8' >> ~/.bashrc
    fi

    # 应用新设置
    echo "应用新设置..."
    export LANG=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
    source ~/.bashrc 2>/dev/null || true

    echo -e "\n修复后的locale设置:"
    locale
else
    echo "未发现明显错误。"
fi

# 检查支持的所有locale
echo -e "\n3. 系统支持的locale:"
locale -a 2>/dev/null | head -20

# 检查字符集
echo -e "\n4. 系统支持的字符集:"
locale -m 2>/dev/null | head -10

echo -e "\n========== 检查完成 =========="
echo "详细日志:/tmp/locale_check.log"

故障排除

# 错误:locale: Cannot set LC_CTYPE to default locale: No such file or directory
# 原因:指定的locale在系统中不存在

# 解决方案:
# 1. 检查系统支持的locale
locale -a

# 2. 如果缺少需要的locale,生成它
# Debian/Ubuntu:
sudo locale-gen zh_CN.UTF-8

# CentOS/RHEL:
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8

# 3. 临时使用存在的locale
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# 4. 永久修改配置文件
# 编辑/etc/default/locale或/etc/locale.conf
# 使用存在的locale名称

# 问题:SSH连接后locale恢复为默认,不是服务器设置的值
# 原因:SSH客户端会传递自己的locale设置

# 解决方案:
# 1. 在SSH服务器端配置(/etc/ssh/sshd_config)
AcceptEnv LANG LC_*

# 2. 重启SSH服务
sudo systemctl restart sshd

# 3. 或者在客户端不发送locale设置
# 修改~/.ssh/config或/etc/ssh/ssh_config
SendEnv -LANG

# 4. 在服务器上强制设置
# 编辑/etc/environment
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8

# 5. 修改PAM配置
# 编辑/etc/pam.d/sshd或/etc/pam.d/login
# 添加:session required pam_env.so readenv=1 envfile=/etc/environment

# 问题:中文字符显示为乱码(菱形、问号等)
# 原因:终端编码与系统locale不匹配

# 解决方案:
# 1. 检查当前locale
locale

# 2. 设置正确的locale
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 3. 检查终端编码设置
# 在终端设置中选择UTF-8编码

# 4. 对于特定程序,设置其编码
# 对于vim:
echo "set encoding=utf-8" >> ~/.vimrc

# 5. 转换文件编码
# 将GBK文件转换为UTF-8
iconv -f GBK -t UTF-8 input.txt -o output.txt

# 6. 检查字体是否支持中文
# 安装中文字体
# Debian/Ubuntu:
sudo apt-get install fonts-wqy-zenhei

# CentOS/RHEL:
sudo yum install wqy-zenhei-fonts

# 错误:bash: locale: command not found
# 原因:最小化安装未包含locale命令或glibc-locales包

# 解决方案:
# 1. 安装locale工具
# Debian/Ubuntu:
sudo apt-get update
sudo apt-get install locales

# CentOS/RHEL:
sudo yum install glibc-common

# Alpine Linux:
apk add musl-locales

# 2. 验证安装
which locale
locale --version

# 3. 如果仍然找不到,检查PATH
echo $PATH
# 通常在/usr/bin/locale

# 4. 使用替代方法查看locale
echo $LANG
echo $LC_ALL
cat /etc/default/locale 2>/dev/null || cat /etc/locale.conf 2>/dev/null
相关命令
  • localectl - systemd系统区域设置控制
  • locale-gen - 生成locale数据
  • update-locale - 更新locale配置
  • localedef - 编译locale定义
  • iconv - 字符编码转换
  • tzselect - 选择时区
  • timedatectl - 系统时间和日期控制
  • env - 显示环境变量
  • export - 设置环境变量
  • source - 执行配置文件
最佳实践
  • 服务器环境推荐使用en_US.UTF-8,避免中文乱码问题
  • 对于需要中文支持的应用,统一使用zh_CN.UTF-8
  • 生产服务器不要轻易修改locale,避免影响现有服务
  • 在Docker容器中,明确设置locale环境变量
  • 备份locale配置文件后再进行修改
  • 测试locale更改后,验证所有相关应用是否正常工作