在嵌入式T113 Linux中,在终端中若输入ls命令,显示乱码等问题,可通过以下步骤解决。
一、配置内核
File systems --->
*- Native language support --->
<* > Simplified Chinese charset (CP936, GB2312)
<* > NLS UTF-8
File systems --->
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows-95) fs support
(936) Default codepage for FAT
(cp936) Default iocharset for FAT /* 括弧中的值可以是utf8或cp936,可按下H查看帮助说明 */
二、设置系统的 LANG 为 zh_CN.UTF-8
可在/etc/profile文件中添加
export LANG=zh_CN.UTF-8
三、挂载U盘时指定字符编码
mount -t vfat -o codepage=936,iocharset=utf8 /dev/sda1 /mnt
若按照上面的选项配置内核,不使用-o选项挂载,则默认就是内核中设定的值,根据实际情况设定。
四、设置secureCRT
设置secureCRT的编码格式为utf-8
五、配置修改busybox
从busybox1.17.0以后,对ls命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,在shell下用ls命令也是无法显示中文的,这是因为busybox1.17.0以后版本对中文的支持进行了限制。现在就来讲讲如何修改让busybox1.17.0以上版本支持中文,要想让busybox1.17.0以上支持中文,需要修改两个文件:printable_string.c以及unicode.c 。
分析源码发现busybox将字符大于0x7f的替换为?。
a.修改busybox源码目录下的./libbb/printable_string.c
先找到这样一段:
if (c < ' ')
break;
if (c >= 0x7f)
break;
s++;
注释掉某两行(34,35行):
/* if (c >= 0x7f) */
/* break; */
然后找这样一段(48行):
unsigned char c = *d;
if (c == '\0')
break;
if (c < ' ' || c >= 0x7f)
*d = '?';
d++;
把 if (c < ' ' || c >= 0x7f) 改成 if (c < ' ')
a.修改busybox源码目录下的./libbb/unicode.c
在配置里,如果Support Unicode选上的:
Busybox Settings->
General Configuration->
[*] Enable locale support (system needs locale for this to work)
[*] Support Unicode
[*] Support for --long-options
那么这样还需要修改一个文件,这个文件就是:unicode.c。如果不修改这个文件,ls命令也是无法显示出中文的。
在函数unicode_conv_to_printable2中
将*d++ = (c >= ' ' && c < 0x7f) ? c : '?'; 修改为*d++ = (c >= ' ') ? c : '?';
将
if(c<'' || c>=0x7f)
*d='?';
修改为
if(c<'')
*d='?';
总之将所有对0x7f的判断条件去掉。
原文链接:https://blog.csdn.net/qpwyj/article/details/41985797
离线