まず、SMBで扱える文字コードはサーバからみると、
「ネイティブ(サーバ依存)」と「Unicode」の2種類、しかしFreeBSDの
mount_smbfsはUnicodeに対応してないので、ネイティブを選択せざるをえない。
一般には普通のwindowsならCP932(SJIS)だが、よくあるsambaの設定は
UTF-8がネイティブコードとして設定されている。
CP932もUTF-8もヌル文字を含まないので、正常に処理されるが、
mount_smbfsのバグのため、ヌル文字を使う文字コードをネイティブコードに使っている
time capsuleはマウントできない・・・といった所みたい。
(マルチバイト文字だけUTF-16BE?なんや不思議なエンコードに見えた)
なのでFreeBSD標準のmount_smbfsではtimecapsuleは正常にマウントできない 。
まとめると・・・・
- windowsは-E UTF-8:CP932であらかた読める(3byte文字問題あり)
- sambaは-E UTF-8:UTF-8で正常に読める。
- timecapsuleは日本語含まなければ読める。
ちなみにこの調査の過程でkernelのlibiconvを拡張して遊んだりしてみた。
元のコードを数行書き換える必要はあったが、
iconv_xlat.c等の既存の変換エンジンをまねして変換エンジンを書いて
追加するだけで、モジュールがガンガン追加できるので実験しやすく面白い。
じゃ、どうすればいいか。
fuse-smbnetfsをつかう・・・というのが楽だけど、当然処理が遅い。
mount_smbfsをとりあえずの改造するならファイル名の扱いをヌル文字OKにするのがいいかな。
libiconv.koのほうには必要に応じて文字コード変換を追加して・・・
しかしながら、長期的にはUnicode対応のほうが絶対有利。今時Unicode吐けないSMBサーバは少数になりつつあるので。