Linuxで読み込んだUSBメモリが文字化けした時の対処方法

こんにちは。今回のテーマはFAT32フォーマットのHDDやUSBドライバの文字化け対処法です。ファイル名が文字化けすると結構焦ります。最近はWindowsとLinux間でのクロスプラットフォームなデータのやり取りも珍しくなくなってきているので、ディストロやデスクトップ環境は文字コードを意識しなくても済むようになっています。それだけに突然起こるファイルの文字化けは対処法に困ったりするものです。
【関連記事】
Linuxで文字コードを変換する方法


CASE 1:Windowsで使っていたUSBメモリのファイル名がLinuxで文字化け

原因はフォーマット形式とマウント時のオプション

USBメモリのフォーマットはデフォルトでFAT32が主流であり、WindowsはFAT32にファイル名を書き込む際にShift_JISにエンコードするため、日本語文字コードがUTF-8やEUC-JPのLinuxでは文字化けを起こします。NTFSの場合はunicodeに対応しているので文字化けは筆者環境では起こりませんでした。USBメモリでデータを持ち運びWindowsからLinuxへ作業環境を帰る方も珍しくないでしょう。最近の自動マウントツールは優秀なので問題ないことが多いですが、ディストロやデスクトップ環境次第では文字化けが起こります。

対策

原因はUSBメモリのマウント時に文字コードを指定しなかったことが原因です。手動でマウント解除して再マウントしましょう。
まず、以下コマンドでUSBメモリのマウント位置を調べます。

$ lsblk

出力例

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 298.1G  0 disk 
├─sda1   8:1    0  93.1G  0 part 
├─sda2   8:2    0     1K  0 part 
├─sda3   8:3    0  97.7G  0 part /
├─sda4   8:4    0  45.8G  0 part 
├─sda5   8:5    0  55.9G  0 part 
└─sda6   8:6    0   5.6G  0 part [SWAP]
sdb      8:16   1   7.5G  0 disk 
└─sdb1   8:17   1   7.5G  0 part /media/usb
sr0     11:0    1  1024M  0 rom  

今回の例だと/dev/sbd1は/media/usbにマウントされていました。では、マウント解除(アンマウント)しましょう。

# umount /run/media/usb

では手動でマウントしましょう。今回は/media/usbにマウントします。マウント用のディレクトリが無い場合は予め作成してください。

# mkdir /meida/usb (ディレクトリがない場合のみ)
# mount -w -o uid=[ユーザー名],iocharset=utf8 /dev/sdb1 /media/usb

上記コマンドのコマンドですが以下の通りです。不要なものは省いてください。

w : 読み書き可能
-o : オプションを付与
uid=[ユーザー名] : ユーザーにパーミッションを付与
iocharset=utf8 : ファイル名をUTF-8に変換

CASE 2:Ubuntuで使ったUSBメモリをArch Linuxで使ったら文字化けが・・・

WindowsとLinuxでは文字コードが異なるためにWindowsで使用していたファイルが文字化けするのはよく知られた話でした。しかし、今回はUbuntuで作成したファイルに日本語名をつけてUSBメディアでArch Linuxで開いたところ文字化けを起こしました。
スクリーンショット - 2014年09月11日 - 17時39分23秒
筆者は少し混乱しました。なぜなら筆者は使用するディストロの文字コードは全てFTU-8で統一しているからです。つまりUbuntuもArch Linuxも文字コードはUTF-8なのです。その証拠にネットワーク上でファイルをやり取りしても文字化けは起こりませんでした。

原因はUSBマウント時のiocharsetのミス

結論から言えば原因は上記のケースと同じマウント時のiocharsetミスでした。つまりUbuntuで手動マウントした時にiocharset=utf8の指定を忘れたのでしょう。結果としてShift_JISでファイル名を書着込んでしまいました。

対策

Windowsと共同で使う可能性がないUSBメモリならばフォーマット形式をex4にしてしまう手もありますが、現実的ではありません。CASE1と同じですが、一度マウント解除して以下コマンドでマウントし直しましょう。

# mount -w -o uid=[ユーザー名],iocharset=utf8 /dev/sdb1 /media/usb

最近はiocharset=utf8は自動マウントでも有効になっているので手動でマウントする機会は少ないと思いますが、自動マウントを止めている方はaliasで別名コマンドを登録した方が楽かも知れませんね。例えば筆者はこのようなエイリアスを登録しています。

$ alias musb1='sudo mount -w -o uid=[ユーザー名],iocharset=utf8 /dev/sdb1 /media/usb1'

これでマウント時は以下コマンドでOKです。(sdb2用にmusb2を用意しても良いです)

$ musb1

補足

フォーマットタイプやcodepageを指定する

今回紹介したコマンドは実は省略形です。当方環境では特に問題ないのでいつも上記コマンドでマウントしていますが、フォーマットタイプやcodepageを指定して読み込みたい場合は以下コマンドを打ち込んでしください。

# mount -w -t vfat -o uid=[ユーザー名],iocharset=utf8,codepage=932 /dev/sdb1 /media/usb

iocharset=utf8でエラーとなる場合

また、お使いの環境によってはiocharset=utf8ではエラーが出る場合があります。その場合は以下のようにしてみてください。

# mount -w -t vfat -o uid=[ユーザー名],utf8 /dev/sdb1 /media/usb

EUC-JPの場合

システムの文字コードがEUC-JPの場合は以下のコマンドでマウントしてください。オプションは任意で省略してください。

# mount -w -t vfat -o uid=[ユーザー名],iocharset=euc-jp,codepage=932 /dev/sdb1 /media/usb

最後に

日本語の文字コードというのものは本当に厄介なものですね。現在は世界的にFTU-8への統一が進められています。Windowsで普及が進んでいるNFTSフォーマットもinicodeに対応しているのでOS間での文字コードの垣根は低くなっていると思いますが、LinuxにおけるNTFSの扱いも微妙なところです。当面クロスプラットフォームで使えるUSBメモリはFAT32フォーマットとなると思います。文字化けしても驚かずに対処しましょう。

Sponsored Link


2件のコメント

  • USBメモリの文字化けへの対処法、大変助かりました。
    結構探したのですが、この方法について載せてくださってるのはこちらのサイトさんだけのようで、Linux初心者がハマりがちなトラブルゆえ、もっとあちこちに情報があってもよさそうなんですが...不思議なことです。

    • こんな間違いだらけの解説載せるなんてここだけだろうよ

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です