搜索
bottom↓
回复: 11

Linux 3.4.2下U盘上的中文文件名乱码,怎么破?

[复制链接]

出0入0汤圆

发表于 2014-6-9 20:42:04 | 显示全部楼层 |阅读模式
本帖最后由 Yaksa 于 2014-6-9 20:50 编辑

折腾了2天,搜了无数文章,内核配置也改过,mount参数也试过,都搞不定,求帮忙。

开发板:TQ2440
系统:Linux 3.4.2
终端工具:xshell 和 secureCRT (编码和字体都试过)

现在内核配置是这样的:
*- 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

mount时试过如下组合:
mount /dev/sda4 /mnt -t vfat -o iocharset=utf8
mount /dev/sda4 /mnt -t vfat -o utf8
mount /dev/sda4 /mnt -t vfat -o codepage=936,iocharset=utf8
...
都显示乱码。

===================分割线===================
# mount /dev/sda4 /mnt -t vfat -o iocharset=utf8
# cat /proc/mounts
...
/dev/sda4 /mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp936,iocharset=cp936,shortname=mixed,utf8,errors=remount-ro 0 0

# mount /dev/sda4 /mnt -t vfat -o iocharset=utf8
FAT-fs (sda4): utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!
# cat /proc/mounts
/dev/sda4 /mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp936,iocharset=utf8,shortname=mixed,errors=remount-ro 0 0

===================分割线===================
插入U盘时的文字提示:
usb 1-1.1: new full-speed USB device number 3 using s3c2410-ohci
scsi0 : usb-storage 1-1.1:1.0
scsi 0:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 2
sd 0:0:0:0: Attached scsi generic sg0 type 0
sd 0:0:0:0: [sda] 966656 512-byte logical blocks: (494 MB/472 MiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] No Caching mode page present
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] No Caching mode page present
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda4
sd 0:0:0:0: [sda] No Caching mode page present
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] Attached SCSI removable disk

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-6-9 20:59:55 | 显示全部楼层
补充一点,文件名乱码,但文本文档里的内容cat出来不乱码。

比如,我先
ls -il
获得那个文件名乱码文件的inode,比如是25,再
find -inum 25 -exec cat {} \;
里面的中文内容就没问题

出0入0汤圆

发表于 2014-6-9 21:00:54 | 显示全部楼层
Yaksa 发表于 2014-6-9 20:59
补充一点,文件名乱码,但文本文档里的内容cat出来不乱码。

比如,我先

Windows的文件名可能是Unicode而不是UTF-8

出0入0汤圆

 楼主| 发表于 2014-6-9 21:20:32 | 显示全部楼层
02015678 发表于 2014-6-9 21:00
Windows的文件名可能是Unicode而不是UTF-8

iocharset=cp936我也试过,同样乱码

出0入0汤圆

发表于 2014-6-9 21:36:32 | 显示全部楼层
本帖最后由 02015678 于 2014-6-9 21:41 编辑

试试这个
  1. mount /dev/sda4 /mnt -t vfat -o utf8=true
复制代码


我之前在Linux下挂载Windows分区遇到乱码的时候是这么搞定的。
你说的几个参数我当时都试过,没想到用utf8=true的时候成功了。

出0入0汤圆

 楼主| 发表于 2014-6-10 08:54:55 | 显示全部楼层

刚刚试了,还是不行, 不过还是谢谢你的帮助.

  1. # mount /dev/sda4 /mnt -t vfat -o utf8=true
  2. # cat /proc/mounts
  3. /dev/sda4 /mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp936,iocharset=cp936,shortname=mixed,utf8,errors=remount-ro 0 0

  4. # mount /dev/sda4 /mnt -t vfat -o utf8=true,iocharset=utf8
  5. # cat /proc/mounts
  6. /dev/sda4 /mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro 0 0
复制代码

出0入0汤圆

发表于 2014-6-10 12:50:53 | 显示全部楼层
本帖最后由 02015678 于 2014-6-10 13:11 编辑

我觉得吧,之所以网上也有很多说法是因为。
很多Linux里附带的mount版本不一样,反正是开源软件,所以大概存在版本分裂的问题。
http://www.fclose.com/159/%E8%A7 ... %E4%B9%B1%E7%A0%81/
这个帖子里用的参数是utf8=1

这个问题确实挺蛋疼,没啥通用的解决办法。要不你再多试试。
在openSUSE 12.3下,
  1. mount /dev/sda4 /mnt -t vfat -o codepage=936,iocharset=utf8
复制代码
  1. mount /dev/sda4 /mnt -t vfat -o utf8=true
复制代码

都可以。
直接mount都可以,自动识别了。

对了你确定你的Xshell现在的配置能支持中文的么

出0入0汤圆

发表于 2014-6-10 13:45:33 | 显示全部楼层
你是在什么环境下看的,哪个终端?

出0入0汤圆

 楼主| 发表于 2014-6-10 19:40:03 | 显示全部楼层
winterw 发表于 2014-6-10 13:45
你是在什么环境下看的,哪个终端?

1楼写了:
开发板:TQ2440
系统:Linux 3.4.2
终端工具:xshell 和 secureCRT

在终端工具中编码和字体都试过,都是乱码

出0入0汤圆

 楼主| 发表于 2014-6-10 19:42:33 | 显示全部楼层
02015678 发表于 2014-6-10 12:50
我觉得吧,之所以网上也有很多说法是因为。
很多Linux里附带的mount版本不一样,反正是开源软件,所以大概 ...

是的,cat某个文件时,里面的汉字显示正常,而且我xshell和secureCRT都试过,甚至还把内容直接输出到板载的LCD上,同样乱码。

出0入0汤圆

 楼主| 发表于 2014-7-21 22:57:08 | 显示全部楼层
终于解决了。
跟 内核配置、mount参数、shell工具 …… 都没有关系,
罪魁祸首是busybox




从busybox1.17.0以上之后,对ls命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,在shell下用ls命令也是无法显示中文的,这是因为busybox1.17.0以后版本对中文的支持进行了限制。
具体修改方法详见Busybox支持中文的解决办法
简单说就是把 c >= 0x7f 部分代码屏蔽掉

出0入0汤圆

发表于 2014-7-22 09:09:26 | 显示全部楼层
Yaksa 发表于 2014-7-21 22:57
终于解决了。
跟 内核配置、mount参数、shell工具 …… 都没有关系,
罪魁祸首是busybox

跟楼主学了一招
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 14:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表