Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 系統字元集 (Locale) 修改完整指南:解決中文亂碼、資料庫導出失敗

編輯:關於 Linux

Linux 系統 Locale (語系/字元集) 設定錯誤會導致中文顯示亂碼、Java/資料庫導出中文變 null、檔案名編碼不一致等問題。本文詳細說明 Locale 機制、查看與修改方法、持久化配置、常見問題場景與解決方案。

核心概念

關鍵規則: LC_ALL > LC_* > LANG。設定 LC_ALL 會忽略所有單項設定。

查看當前 Locale

locale
# 輸出範例:
# LANG=en_US.UTF-8
# LC_CTYPE="en_US.UTF-8"
# LC_NUMERIC="en_US.UTF-8"
# ...
# LC_ALL=

locale -a   # 列出系統支援的所有 locale
locale -m   # 列出支援的字元映射 (編碼)

修改方法

1. 臨時修改 (當前 Shell 生效)

export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 立即生效,關閉終端失效

2. 永久修改 - 系統級 (所有使用者)

RHEL/CentOS/Fedora (systemd):

# 方法一:localectl (推薦)
localectl set-locale LANG=zh_CN.UTF-8

# 方法二:編輯配置檔
vim /etc/locale.conf
# 內容:
LANG=zh_CN.UTF-8
# LC_CTYPE=zh_CN.UTF-8  # 如需單獨設定

Ubuntu/Debian:

# 方法一:update-locale (推薦)
sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8

# 方法二:編輯
vim /etc/default/locale
# 內容:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8

3. 永久修改 - 使用者級

vim ~/.bashrc
# 末尾加入:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
source ~/.bashrc

4. 生成 Locale (若目標 locale 未安裝)

# RHEL/CentOS
localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
# 或
dnf install langpacks-zh_CN

# Ubuntu/Debian
locale-gen zh_CN.UTF-8
dpkg-reconfigure locales  # 互動式選擇

經典問題場景與解決

場景一:Java/資料庫導出中文變 null

現象: 條件含中文查詢,導出 Excel 顯示 null。

原因: JVM 預設編碼為 file.encoding (受 LANG/LC_CTYPE 影響),非 UTF-8 導致中文解析失敗。

解決:

  1. 系統級設定 LANG=zh_CN.UTF-8 (如上)
  2. JVM 啟動參數強制:-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
  3. 資料庫連線字串指定編碼:MySQL ?characterEncoding=utf8、PostgreSQL client_encoding=utf8

場景二:終端顯示中文亂碼/方塊字

檢查: 終端模擬器編碼設定 (Putty/Xshell/Terminal.app → UTF-8) + 系統 LC_CTYPE。

解決: 確保兩端一致為 UTF-8。

場景三:檔案名編碼不一致 (Samba/NFS/FTP)

現象: Windows 建立中文檔名,Linux 掛載顯示亂碼。

解決: 掛載選項指定 iocharset=utf8 (SMB/CIFS)、nls=utf8 (FAT/NTFS)。

場景四:Python 3 開啟檔案編碼警告

# 程式碼開頭宣告
# -*- coding: utf-8 -*-
# 或 Python 3.7+ 環境變數
export PYTHONUTF8=1

常見編碼對照表

變數作用優先級
LANG預設語系 (語言_地區.編碼)低
LC_CTYPE字元分類與轉換 (編碼核心)中
LC_MESSAGES系統提示訊息語言中
LC_ALL強制覆蓋所有 LC_* 變數最高
LANGUAGE訊息語言備選列表 (冒號分隔)僅影響 gettext
Locale 值編碼適用場景
zh_CN.UTF-8UTF-8現代標準,全字元支援,推薦
zh_CN.GB18030GB18030國標擴展,含生僻字,政府/舊系統
zh_CN.GB2312GB2312舊國標,字元集較小,不推薦新專案
zh_CN.GBKGBK微軟擴展 GB2312,Windows 相容
en_US.UTF-8UTF-8英文環境,國際化預設

驗證修改生效

# 重新登入或重啟後
locale | grep -E 'LANG|LC_CTYPE|LC_ALL'

# 測試中文顯示
echo "測試中文"
date  # 應顯示中文日期格式

# 測試 Python 編碼
python3 -c "import sys; print(sys.getdefaultencoding())"  # 應為 utf-8

統一系統 Locale 為 zh_CN.UTF-8 並確保應用層編碼一致,可徹底解決 90% 以上的中文編碼問題。

Copyright © Windows教程網 All Rights Reserved