您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
前一段時(shí)間解決的一個(gè)問(wèn)題,看起來(lái)是個(gè)小問(wèn)題,實(shí)際解決這個(gè)問(wèn)題卻花了一個(gè)星期的晚上休息時(shí)間,記錄分享一下。
問(wèn)題描述:
linux內(nèi)核配置中NLS(native language support)已經(jīng)選擇了默認(rèn)語(yǔ)言配置為utf8,并包含一些其他常用語(yǔ)言的編碼,但是在secureCRT的telnet和串口終端顯示中文文件名均為亂碼。
解決過(guò)程:
1.剛開始以為是簡(jiǎn)單的編碼不匹配的問(wèn)題,修改secureCRT中的傳輸編碼方式從默認(rèn)變?yōu)閡tf8,中文不再亂碼,但變成了問(wèn)號(hào),“??????”;
2.因?yàn)橹形哪夸浭窃趻燧d的SD卡中的(居然沒有嘗試一下網(wǎng)絡(luò)掛載或者其他的方式下中文是否亂碼,汗),懷疑是掛載SD卡方式不對(duì)。網(wǎng)上解答全部都是說(shuō),編譯內(nèi)核的時(shí)候fat文件系統(tǒng)的codepage和isochaset配置對(duì),掛載時(shí)選擇vfat,-o命令選擇codepage和isocharset匹配就好了,具體的命令是,mount -t vfat -o codepage=936,iocharset=utf8 /dev/mmcblk0p1 /home/。然后接下來(lái)幾天晚上就一直在鼓搗這些東西,無(wú)解;
3.有一天忽然找到一篇博文,說(shuō)是busybox的原因,高版本的busybox取消了中文支持,想不到還有這茬。進(jìn)入busybox配置,發(fā)現(xiàn)已經(jīng)勾選了Unicode的支持。如此按博文提示,還需要修改busybox中的另外兩個(gè)文件printable_string.c以及unicode.c,把大于0x7f替換為問(wèn)號(hào)的這個(gè)選擇條件去掉才行。看了一下源碼,覺得改的地方都是不勾Unicode才需要改的……不過(guò)還是試一下吧,重新配置編譯busybox,替換根文件系統(tǒng),不過(guò)問(wèn)題依舊……
4.既然上面的提示中已經(jīng)發(fā)現(xiàn)不勾選Unicode支持中文的方式,那就先試一下不支持Unicode顯示中文的方式吧,修改printable_string.c以及unicode.c,重新編譯,燒寫啟動(dòng)設(shè)備,發(fā)現(xiàn)去掉Unicode果然中文支持了,不再顯示問(wèn)號(hào);
5.但是這樣子草草了事明顯是不行的,那又是為什么勾選Unicode支持后中文變問(wèn)號(hào)呢?那就只能讀源碼了,還好范圍也可以接受,問(wèn)題應(yīng)該就出在修改的兩個(gè)文件里面。
6.LAST_SUPPORTED_WCHAR,通過(guò)busybox源碼,可以發(fā)現(xiàn)有這么一個(gè)判斷if (wc > CONFIG_LAST_SUPPORTED_WCHAR){go subset;},而在subset的地方,wc被賦值為問(wèn)號(hào),這下問(wèn)題就明朗了,明顯是這個(gè)LAST_SUPPORTED_WCHAR搞的鬼;
7.查看busybox配置,發(fā)現(xiàn)這個(gè)宏定義表示的是Range of supported Unicode characters,默認(rèn)填的值才700多,而中文在Unicode中的位置查了一下最高到U+2FA1D,隨便給這個(gè)值改了一個(gè)大于2FA1D的值,重新編譯燒寫根文件系統(tǒng),中文顯示成功!
走了不少?gòu)澛罚迷谧詈髥?wèn)題是解決了!最后記錄一下,busybox版本是1.19.4!
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08