移植usb驱动后,挂载u盘,结果中文显示?,经过努力终于搞定。
参考文章:http://blog.csdn.net/chenlong12580/article/details/7259965
http://biancheng.dnbcw.info/linux/355449.html
显示?的问题主要有两个:
1. busybox不支持中文。
2.挂载参数用的不对。
在嵌入式linux系统中,busybox是最常见的用来构建文件系统的。可是从busybox1.17.0以上之后,对ls命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,在shell下用ls命令也是无法显示中文的,这是因为busybox1.17.0以后版本对中文的支持进行了限制。在制作根文件系统时,需要对busybox中/libbb/printable_string.c 和 /libbb/unicode.c 进行修改。
在/printable_string.c找到
- if (c < ' ')
- break;
- if (c >= 0x7f)
- break;
- s++;
注释掉3行和4行
- if (c < ' ')
- break;
- /*
- if (c >= 0x7f)
- break;
- */
- s++;
找到如下代码段
- unsigned char c = *d;
- if (c == '\0')
- break;
- if (c < ' ' || c >= 0x7f)
- *d = '?';
- d++;
- unsigned char c = *d;
- if (c == '\0')
- break;
- if (c < ' ' /*|| c >= 0x7f */)
- *d = '?';
- d++;
在unicode.c 找到如下代码段:
- *d++ = (c >= ' ' && c < 0x7f) ? c : '?';
- src++;
- }
- *d = '\0';
- } else {
- d = dst = xstrndup(src, width);
- while (*d) {
- unsigned char c = *d;
- if (c < ' ' || c >= 0x7f)
- *d = '?';
修改第1行和第9行:
- *d++ = (c >= ' '/* && c < 0x7f */) ? c : '?';
- src++;
- }
- *d = '\0';
- } else {
- d = dst = xstrndup(src, width);
- while (*d) {
- unsigned char c = *d;
- if (c < ' '/* || c >= 0x7f */)
- *d = '?';
然后在编译busybox时添加 locale support 支持
Busybox Settings --->
General Configuration --->
[*] Enable locale support (system needs locale for this to work)
[*] Support Unicode
[*] Use libc routines for Unicode (else uses internal ones)
General Configuration --->
[*] Enable locale support (system needs locale for this to work)
[*] Support Unicode
[*] Use libc routines for Unicode (else uses internal ones)
此时编译根文件系统还不能显示中文,因为没有相关的字符集。
下面就要添加字符集
在系统文件的 /usr/lib 目录下 添加 gconv (字符转换)目录(从PC上复制过来(/usrlib/gconv/))
这样构建的根文件系统就可以显示中文了。
不过不要得意哦,还有一步要做:
就是使用挂载命令:
mount -t vfat -o iocharset=cp936 /dev/sda1 /mnt 就可以完全显示中文了。
并且没有FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!