busybox支持中文详解

一、环境概述
  • BusyBox 版本:1.29.3
  • 内核版本:3.10.108
  • 目标:配置系统支持 UTF-8 编码,实现中文等 Unicode 字符的显示与处理
二、内核 UTF-8 支持配置
1. 配置路径与选项说明

内核需开启 Native Language Support(NLS)以支持多语言字符集:

配置路径:
File systems > Native language support
  (utf8) Default NLS Option  # 设置默认字符集为UTF-8

File systems > DOS/FAT/NT Filesystems
  (utf8) Default iocharset for FAT  # 确保FAT文件系统使用UTF-8编码
2. 配置原理
  • NLS(Native Language Support):内核中的字符集转换模块,负责不同字符集之间的转换
  • UTF-8 默认选项:确保内核在加载字符集时优先使用 UTF-8,避免乱码问题
  • FAT 文件系统编码:解决 U 盘等 FAT 格式存储设备中文文件名显示问题
三、BusyBox UTF-8 支持配置
1. 菜单配置详解

通过make busybox-menuconfig进入配置界面:

配置路径:
Settings > Library Tuning
  [*] Enable locale support (system needs locale for this to work)  # 启用区域设置支持
  [*] Support Unicode  # 启用Unicode支持
  [ ]   Use libc routines for Unicode (else uses internal ones)  # 不使用libc的Unicode函数,使用BusyBox内置实现
  [*]   Check $LC_ALL, $LC_CTYPE and $LANG environment variables  # 检查环境变量以确定字符集
  (63)  Character code to substitute unprintable characters with  # 不可打印字符替换为'?'(ASCII码63)
  (195101) Range of supported Unicode characters  # 支持的Unicode范围扩展到U+2FA1D(195101十进制)
2. 关键配置项说明
  • 区域设置支持:使 BusyBox 工具(如 ls、echo)能读取系统语言环境变量
  • Unicode 支持
    • 若勾选Use libc routines,需系统 libc 库支持 Unicode(如 glibc)
    • 不勾选时,BusyBox 使用内置 Unicode 处理函数,适合轻量级系统
  • Unicode 范围设置:195101 对应 U+2FA1D,覆盖 CJK 扩展 H 区,确保生僻字支持
四、BusyBox 源码修改(中文补丁)
1. 准备工作目录

首先进入 BusyBox 源码目录,并创建两个工作目录:

cd output/build/busybox-1.29.3
mkdir a
mkdir b
2. 复制文件

将 libbb 目录分别复制到两个工作目录中:

cp -faR libbb ./a
cp -faR libbb ./b
3. 修改文件内容

接下来需要修改 b 目录下的相关文件,主要是屏蔽掉将 0x7f 及以上字符替换为 '?' 的条件判断。

编辑./b/libbb/printable_string.c文件,找到并修改以下代码:

/* 修改前 */
if (c >= 0x7f)
    break;

/* 修改后 */
/* support chinese display */
/*if (c >= 0x7f)
    break;
*/

/* 修改前 */
if (c < ' ' || c >= 0x7f)
    *d = '?';

/* 修改后 */
/* support chinese display */
/*
if (c < ' ' || c >= 0x7f)
    *d = '?';
*/
if (c < ' ')
    *d = '?';

编辑./b/libbb/unicode.c文件,找到并修改以下代码:

/* 修改前 */
if (c >= 0x7f)
    *d = '?';

/* 修改后 */
/* support chinese display */
/*
if (c >= 0x7f)
    *d = '?';
*/
if (c < ' ')
    *d = '?';
4. 制作补丁

修改完成后,使用 diff 命令生成补丁文件:

diff -Nura a/libbb/printable_string.c b/libbb/printable_string.c >> 0004-support-chinese-display.patch
diff -Nura a/libbb/unicode.c b/libbb/unicode.c >> 0004-support-chinese-display.patch

生成的补丁内容如下:

--- a/libbb/printable_string.c  2018-07-02 19:23:06.000000000 +0800
+++ b/libbb/printable_string.c  2023-01-09 14:09:39.842159597 +0800
@@ -28,8 +28,10 @@
        }
        if (c < ' ')
            break;
-       if (c >= 0x7f)
+       /* support chinese display */
+       /*if (c >= 0x7f)
            break;
+       */
        s++;
    }

@@ -42,8 +44,13 @@
            unsigned char c = *d;
            if (c == '\0')
                break;
+           /* support chinese display */
+           /*
            if (c < ' ' || c >= 0x7f)
                *d = '?';
+           */
+           if (c < ' ')
+               *d = '?';
            d++;
        }
        if (stats) {
--- a/libbb/unicode.c   2018-07-02 19:23:06.000000000 +0800
+++ b/libbb/unicode.c   2023-01-09 14:13:38.044330970 +0800
@@ -1019,7 +1019,9 @@
                    while ((int)--width >= 0);
5. 应用补丁

最后,将生成的补丁文件复制到 BusyBox 的 package 目录下:

cp 0004-support-chinese-display.patch package/busybox/
五、编译 BusyBox

sudo make busybox
六、系统语言环境配置
1. 检查与部署语言包
# 1. 在Buildroot目录中查找i18n文件
find . -name i18n

# 2. 拷贝交叉编译器的i18n到系统目录
cp -r /path/to/cross-compiler/lib/i18n /usr/share/

# 3. 检查locale工具
find /path/to/cross-compiler -name locale
find /path/to/cross-compiler -name localedef

# 4. 拷贝locale工具到系统bin目录
cp /path/to/cross-compiler/bin/locale /bin/
cp /path/to/cross-compiler/bin/localedef /bin/
2. 创建中文语言支持文件
# 1. 创建locale目录
mkdir -p /usr/lib/locale

# 2. 生成zh_CN.UTF-8语言定义
localedef -f UTF-8 -i zh_CN zh_CN.UTF-8

# 3. 设置默认语言环境(修改/etc/profile)
echo "export LANG=zh_CN.UTF-8" >> /etc/profile

通过以上步骤,可在 BusyBox 1.29.3 和内核 3.10.108 环境下完整配置 UTF-8 支持,实现中文等 Unicode 字符的正确显示与处理。配置过程中需注意交叉编译工具链的完整性和补丁文件的兼容性。

你可能感兴趣的:(嵌入式/ARM,linux,arm开发)