2012年10月09日

Android/Linuxでのファイルシステム文字コードの扱いのメモ


ファイルシステム上のエンコード
最近のファイルシステムはユニコードで決め打ちされているので考慮する必要はない。FATなどの古いファイルシステムでのみ問題になる。(厳密にはUCS-2でUTF-16非対応だったりするけど。)
FAT32ショートファイル名ならShift_JISなど(正確にはcp932)。ロングファイル名(8.3形式でない名前)は後付け規格なので問題ない。

OSの内部エンコード
基本的にUTF-8。

Linuxネイティブソフトウェアのエンコード
ソフトウェアが解釈できるエンコードはソフトによる。ASCIIしか表示できないアプリもあれば、UTF-8を解釈できたり、EUC-JPのままだったりする古いアプリもある。

Androidアプリのエンコード
Java自体ユニコードに対応しているので、HTTPなどで外から取得したバイナリを下手に変換しない限り考慮する必要は無い。

マウントオプション
vfatマウントについては、
http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/vfat.txt
がわかりやすい。

XperiaAcroのマウントオプションは(noatimeに上書きしているけどfatは意味ないはず)
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,noatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
Xperiaデフォルトの文字コード関連オプションは、codepage=cp437,iocharset=iso-8859-1,utf8なので、ショートファイル名には1バイト文字、ロングファイル名とOS内部とのIOはUTF-8変換がなされる。
もし接続したSDメモリなどのショートファイルに日本語文字が含まれてしまっていて、正しく読み書きできない場合は、codepage=cp932にすれば解決するはず。

USB-OTGでFATファイルシステムをマウントする場合、マウントオプションでcodepage=cp437,utf8を指定すれば、windowsマシンに持って行っても文字化けしたりアクセスできなくなることは無いはず。

だけど、デザイアさんが四苦八苦していた。有償版StickMountが発行するマウントオプションが知りたい。
もしかしたら、nexus7はSDメモリ非対応なのでFAT用のnls_cp437が入っていないのかも。nls_cp437.koとnls_utf8.koをいれればどうにかなるかも?

なおCIFSで日本語の読み書きにはiocharset=utf8にする必要があった。
ウィンドウズファイル共有自体はUTF-16で決め打ちなので、SMBプロトコルとOS内部間でUTF-16/UTF-8変換が必要で、nls_utf8.koも同時に必要だった。



posted by ko-zu at 19:54| Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。