一、环境概述
- 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 字符的正确显示与处理。配置过程中需注意交叉编译工具链的完整性和补丁文件的兼容性。
1万+

被折叠的 条评论
为什么被折叠?



