内核需开启 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编码
通过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十进制)
Use libc routines
,需系统 libc 库支持 Unicode(如 glibc)首先进入 BusyBox 源码目录,并创建两个工作目录:
cd output/build/busybox-1.29.3
mkdir a
mkdir b
将 libbb 目录分别复制到两个工作目录中:
cp -faR libbb ./a
cp -faR libbb ./b
接下来需要修改 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 = '?';
修改完成后,使用 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);
最后,将生成的补丁文件复制到 BusyBox 的 package 目录下:
cp 0004-support-chinese-display.patch package/busybox/
sudo make busybox
# 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/
# 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 字符的正确显示与处理。配置过程中需注意交叉编译工具链的完整性和补丁文件的兼容性。