Linuxで読み込んだUSBメモリが文字化けした時の対処方法
2014-09-13
2015-02-11
こんにちは。今回のテーマはFAT32フォーマットのHDDやUSBドライバの文字化け対処法です。ファイル名が文字化けすると結構焦ります。最近はWindowsとLinux間でのクロスプラットフォームなデータのやり取りも珍しくなくなってきているので、ディストロやデスクトップ環境は文字コードを意識しなくても済むようになっています。それだけに突然起こるファイルの文字化けは対処法に困ったりするものです。 【関連記事】 Linuxで文字コードを変換する方法 [adsense02]
CASE 1:Windowsで使っていたUSBメモリのファイル名がLinuxで文字化け
原因はフォーマット形式とマウント時のオプション
USBメモリのフォーマットはデフォルトでFAT32が主流であり、WindowsはFAT32にファイル名を書き込む際にShift_JISにエンコードするため、日本語文字コードがUTF-8やEUC-JPのLinuxでは文字化けを起こします。NTFSの場合はunicodeに対応しているので文字化けは筆者環境では起こりませんでした。USBメモリでデータを持ち運びWindowsからLinuxへ作業環境を帰る方も珍しくないでしょう。最近の自動マウントツールは優秀なので問題ないことが多いですが、ディストロやデスクトップ環境次第では文字化けが起こります。
対策
原因はUSBメモリのマウント時に文字コードを指定しなかったことが原因です。手動でマウント解除して再マウントしましょう。 まず、以下コマンドでUSBメモリのマウント位置を調べます。
$ lsblk
出力例 [bash] 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 [/bash] 今回の例だと/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で開いたところ文字化けを起こしました。 筆者は少し混乱しました。なぜなら筆者は使用するディストロの文字コードは全て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フォーマットとなると思います。文字化けしても驚かずに対処しましょう。 [adsense]